├── BUILD ├── COPYING ├── ChangeLog ├── LICENSE ├── Makefile ├── Notes ├── footnote-style.mbx ├── oldstyle.txt ├── stuff-ownership.mbx └── texinfo-macros.mbx ├── README ├── bootstrapping ├── ChangeLog ├── jrtangle0 ├── jrweave0 └── makepdf0 ├── template.twjr ├── texindex ├── texinfo.tex ├── texiwebjr.twjr ├── third_way.eps └── third_way.png /BUILD: -------------------------------------------------------------------------------- 1 | Mon Apr 22 22:05:27 IDT 2019 2 | ============================ 3 | 4 | 0. Prerequisites 5 | a. Make sure that you have TeX installed along with the Texinfo suite, 6 | such as texi2dvi and texindex. You will also need the Metafont 7 | logo. 8 | 9 | b. Make sure that you have gawk 4.0 or later in your path. For the 10 | scripts to work as-is, it should be /usr/bin/gawk. (This is where 11 | most Linux distributions put it.) 12 | 13 | c. To build and install gawk manually, the usual incantation should work: 14 | 15 | wget http://ftp.gnu.org/gnu/gawk/gawk-5.0.0.tar.gz 16 | tar -xzf gawk-5.0.0.tar.gz 17 | cd gawk-5.0.0 18 | ./configure && make && make check && sudo make install 19 | 20 | 1. Bootstrap the scripts and all the various formats: 21 | 22 | # Edit ./bootstrapping/jrtangle0 to point to the installed gawk 23 | # if it's different. Also edit texiwebjr.twjr to point to the 24 | # same place. 25 | make # Use the Makefile from the Git repo 26 | -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /ChangeLog: -------------------------------------------------------------------------------- 1 | 2024-01-25 Arnold D. Robbins 2 | 3 | * texiwebjr.twjr: Update revision number and date. 4 | Update copyright year. Other small fixes. 5 | 6 | 2024-01-24 Arnold D. Robbins 7 | 8 | * texinfo.tex: Update to current. 9 | * texiwebjr.twjr: More prose, fix indexing, fix menues. 10 | * third_way.eps: New file. 11 | 12 | 2024-01-24 Arnold D. Robbins 13 | 14 | * template.twjr: Update for current texinfo.tex. 15 | * texiwebjr.twjr: Move to https URLs. Other small 16 | fixes. 17 | 18 | 2019-04-29 Arnold D. Robbins 19 | 20 | * texiwebjr.twjr: Remove markup in arguments to @sortas used 21 | for indexing the chunk definitions and uses. 22 | 23 | 2019-04-22 Arnold D. Robbins 24 | 25 | * texiwebjr.twjr: Remove the special command for braces in indexes. 26 | Add @sortas in chunk index calls. Note that this needs more 27 | work. Update path where gawk should be. Also latest gawk version. 28 | Update official date and version. Fix bug in padding calculation 29 | for print_do_not_edit function. 30 | * BUILD: Update expected path for gawk. 31 | 32 | 2019-03-27 Arnold D. Robbins 33 | 34 | * texiwebjr.twjr: Add handling of @ignore lines. Change #! path 35 | to gawk to /usr/bin/gawk. Update dates and version to 1.0. 36 | Add gawk version checking chunk from Texinfo copy of jrtangle. 37 | 38 | 2018-11-16 Arnold D. Robbins 39 | 40 | * texinfo.tex: Updated to current. 41 | * texiwebjr.twjr: Add @value expansion, start on rework into 42 | a general text on literate programming as well as the TexiWeb Jr. 43 | description. 44 | 45 | 2016-12-28 Arnold D. Robbins 46 | 47 | * texiwebjr.twjr: Add shiftwidth setting for vim, whitespace tweak. 48 | * template.twjr: Add shiftwidth setting for vim. 49 | 50 | 2016-07-01 Arnold D. Robbins 51 | 52 | * texiwebjr.twjr (The Makefile): Use `fop' to make PDF from 53 | DocBook; dblatex doesn't work. 54 | 55 | 2016-04-06 Arnold D. Robbins 56 | 57 | * texiwebjr.twjr (The Makefile): Regularize and add info target, 58 | build all the various forms. Bump the version to 0.98 and update 59 | the modified date. 60 | (Figure): Improve the docbook for the figure. 61 | * BUILD: Update the text. 62 | 63 | 2016-03-30 Arnold D. Robbins 64 | 65 | * texiwebjr.twjr: Update menus for makeinfo. 66 | Bump the version to 0.97 and update the modified date. 67 | 68 | 2016-02-20 Arnold D. Robbins 69 | 70 | * LICENSING, BUILD: Update. 71 | * texinfo.tex, texindex: Update to versions from Texinfo 6.1. 72 | * texiwebjr.twjr: Update copyright in GPL chunk, bump version 73 | to 0.96. 74 | * template.twjr: Remove verbatim copying restriction on text. 75 | 76 | 2016-02-19 Arnold D. Robbins 77 | 78 | * texiwebjr.twjr: Relicense under the GPL. Bump version to 0.95. 79 | Add Github URL to the preface. 80 | * README: Updated. 81 | 82 | 2016-02-19 Arnold D. Robbins 83 | 84 | * texiwebjr.twjr: Fix a typo. 85 | 86 | 2015-05-07 Arnold D. Robbins 87 | 88 | * texiwebjr.twjr: Add a closing right brace to make the 2015-02-27 89 | change actually work. 90 | 91 | 2015-02-27 Arnold D. Robbins 92 | 93 | * texiwebjr.twjr: Enhance the Update_recipe to handle Windows. 94 | For shell debug, check that TEMP doesn't match a Windows file path. 95 | Thanks to Eli Zaretskii . 96 | * texiwebjr.twjr: Add 2015 to copyrights. 97 | 98 | 2014-12-30 Arnold D. Robbins 99 | 100 | * texiwebjr.twjr: Let jrweave turn on automatic full titles in 101 | cross references. Thanks to Karl Berry for the suggestion. 102 | Update versions, dates, etc. 103 | * texmplate.twjr: Remove `@xrefautomaticsectiontitle on'. 104 | 105 | 2014-12-07 Arnold D. Robbins 106 | 107 | * texiwebjr.twjr: Add github location to generated programs. 108 | Thanks to Karl Berry for the suggestion. 109 | 110 | 2014-07-04 Arnold D. Robbins 111 | 112 | * texiwebjr.twjr: Minor edit in acknowledgements. 113 | 114 | 2014-04-30 Arnold D. Robbins 115 | 116 | * BUILD: New file. 117 | 118 | 2014-04-26 Arnold D. Robbins 119 | 120 | * texiwebjr.twjr: About done with the cleanups. A little more 121 | to go. 122 | 123 | * texiwebjr.twjr: Finished the cleanups! Bump edition to 0.8. 124 | 125 | 2014-04-20 Arnold D. Robbins 126 | 127 | * texiwebjr.twjr: Checkpoint checkin and push. Most of the way 128 | through lots of cleanups. 129 | 130 | 2014-04-01 Arnold D. Robbins 131 | 132 | * texiwebjr.twjr: Fix printing of other definitions for chunks. 133 | 134 | 2014-03-18 Arnold D. Robbins 135 | 136 | * texiwebjr.twjr: Make numberless chunks the default, change the 137 | command to @numberedchunks. Remove use of @numberlesschunks. 138 | * template.twjr: Remove use of @numberlesschunks. 139 | 140 | 2014-03-17 Arnold D. Robbins 141 | 142 | * texiwebjr.twjr: Fix spelling errors. Uppercase first letter of 143 | each chunk name. Set for printing. 144 | 145 | 2014-03-15 Arnold D. Robbins 146 | 147 | * texiwebjr.twjr: Figure out how to put the chunk cross reference 148 | info into a smaller font. Thanks to Karl Berry for the help. 149 | 150 | Minor improvements in formatting chunk xrefs. Improve the 151 | "do not edit" message. 152 | 153 | 2014-03-14 Arnold D. Robbins 154 | 155 | * texindex: New file. Needed if using @allowindexbraces. 156 | 157 | 2014-03-13 Arnold D. Robbins 158 | 159 | * texiwebjr.twjr: Considerably reworked chunk collection and 160 | printing to dump cross reference info after each chunk. The 161 | former commands for dumping at the end are temporarily disabled 162 | and there are still FIXMEs, but this is finally good enough to 163 | do a checkpoint check-in. 164 | 165 | Restored commands to build lists of file definitions, code 166 | definitions and code references. 167 | 168 | Add @allowindexbraces command. Add clean and distclean targets 169 | to the Makefile. 170 | 171 | Add @numberlesschunks command. Bug fix in chunk name formatting 172 | in a few places. 173 | 174 | * template.twjr: Add commands that improve printed output. 175 | 176 | 2014-03-10 Arnold D. Robbins 177 | 178 | * template.twjr: Add printing of chunk definitions and references 179 | at end. 180 | 181 | 2014-03-05 Arnold D. Robbins 182 | 183 | * texiwebjr.twjr: Revise `oldnum' macro per advice from Karl 184 | Berry. Switch on indexing that understands braces; requires 185 | new texindex program written in awk by yours truly. This latter 186 | needs to move into a TexiWebJR command. 187 | 188 | 2014-02-22 Arnold D. Robbins 189 | 190 | * texindex.tex: Sync with current Texinfo SVN. 191 | * template.twjr: Remove last reference to jrweave and jrtangle 192 | in body of the document. Oops. 193 | 194 | 2014-01-13 Arnold D. Robbins 195 | 196 | * texiwebjr.twjr: Fix spelling error and minor edit. 197 | Allow multiple files for jrweave. Lots more editing. 198 | 199 | 2014-01-09 Arnold D. Robbins 200 | 201 | * texiwebjr: New commands: @dquotexrefs, @pdflinkcolor, 202 | @urllinkcolor, @hideurls. 203 | * texinfo.tex: Updated. 204 | 205 | 2014-01-05 Arnold D. Robbins 206 | 207 | * texiwebjr.twjr: Add mark URL. Add an additional gawk extension. 208 | More general editing. 209 | 210 | 2014-01-04 Arnold D. Robbins 211 | 212 | * texiwebjr.twjr: Add code to compute and do an @need 213 | before each chunk. Fix info about mweb. 214 | 215 | 2014-01-02 Arnold D. Robbins 216 | 217 | * texiwebjr.twjr: A fair amount of general edits, including making 218 | it work with current makeinfo for HTML. Update copyright years 219 | everywhere. 220 | * template.twjr: New file. 221 | * LICENSE: Update copyright years. 222 | 223 | 2014-01-01 Arnold D. Robbins 224 | 225 | * texiwebjr.twjr: Add a placeholder for dealing with @need. 226 | 227 | 2013-12-09 Arnold D. Robbins 228 | 229 | * texiwebjr.twjr: Add a section on literate programming and me, 230 | including a description of Mike Brennan's mweb. Thanks to Mike 231 | for pointing this out. 232 | 233 | 2013-12-04 Arnold D. Robbins 234 | 235 | * texiwebjr.twjr: Improve code definition list prose. Add another 236 | FIXME to the Makefile. Ready for review! 237 | 238 | 2013-12-03 Arnold D. Robbins 239 | 240 | * texiwebjr.twjr: Lots of clean-up edits. 241 | 242 | 2013-12-02 Arnold D. Robbins 243 | 244 | * texiwebjr.twjr: Improvements for generating docbook. 245 | 246 | 2013-11-29 Arnold D. Robbins 247 | 248 | * texiwebjr.twjr: Start on cleanup edits. 249 | 250 | 2013-12-01 Arnold D. Robbins 251 | 252 | * texiwebjr.twjr: Add indices for chunk definitions and references. 253 | 254 | 2013-11-28 Arnold D. Robbins 255 | 256 | * texiwebjr.twjr: Further indexing improvements. 257 | Move to regular @uref command. Remove an unused chunk. 258 | 259 | 2013-11-27 Arnold D. Robbins 260 | 261 | * texiwebjr.twjr: Start on indexing improvements. 262 | 263 | 2013-11-26 Arnold D. Robbins 264 | 265 | * texiwebjr.twjr: Update menus. Disallow stdin for jrweave input. 266 | Write a makefile. Write the evaluation and futures chapter. 267 | Minor improvements in the bibliography. 268 | 269 | 2013-11-25 Arnold D. Robbins 270 | 271 | * texiwebjr.twjr: Add acknowledgements. Fix use of @author. 272 | 273 | 2013-11-24 Arnold D. Robbins 274 | 275 | * texiwebjr.twjr: Add code references. We're now at feature 276 | complete! 277 | 278 | Further work on prose: remove some FIXMEs that are handled, 279 | jrweave helper functions, put initial setup into its own node, 280 | git download. 281 | 282 | 2013-11-23 Arnold D. Robbins 283 | 284 | * texiwebjr.twjr: Some fixes, not quite a start on printing 285 | code references. 286 | 287 | 2013-11-22 Arnold D. Robbins 288 | 289 | * texiwebjr.twjr: More progress, mostly filling in missing prose. 290 | Added some error checking, more stuff in the bibliography. 291 | * third_way.png: New file. From http://xkcd.com/1285. 292 | 293 | 2013-11-21 Arnold D. Robbins 294 | 295 | * texiwebjr.twjr: Lots of progress. Code almost completely 296 | refactored in order to share common segments; this was a major 297 | effort. Printing file and code definitions done. 298 | Added an initial setup section, just to test the code. 299 | 300 | 2013-11-20 Arnold D. Robbins 301 | 302 | * texiwebjr.twjr: Comment out short title page and summary contents 303 | page. Straighten out what is common and what is specific to each 304 | program w.r.t. the functions. Some cleanup, some more FIXMEs 305 | added. 306 | 307 | 2013-11-19 Arnold D. Robbins 308 | 309 | * texiwebjr.twjr: Add in sidebar handling in prose, break up 310 | authoring additions section into two subsections. 311 | Add macros and sidebar to list of new commands. 312 | Run a spell check. 313 | 314 | 2013-11-18 Arnold D. Robbins 315 | 316 | * texiwebjr.twjr: Start on bootstrapping chapter. 317 | 318 | 2013-11-17 Arnold D. Robbins 319 | 320 | * texiwebjr.twjr: Add list of commands. Some minor formatting 321 | cleanups. 322 | 323 | 2013-11-16 Arnold D. Robbins 324 | 325 | * texiwebjr.twjr: Add a command to switch back to @example. 326 | Add lots of URLs. Allow user to set Shell_debug from the 327 | command line; good for non-POSIX environments. 328 | 329 | 2013-11-15 Arnold D. Robbins 330 | 331 | * texiwebjr.twjr: Let the user set the tabstop. 332 | Includes adding prose for expanding tabs. 333 | Add a command to move to @smallexample. 334 | 335 | 2013-11-14 Arnold D. Robbins 336 | 337 | * texiwebjr.twjr: Use functions for generating anchor names 338 | and chunk names. First step towards merging the processing. 339 | Merge constants into one chunk inside one BEGIN block. 340 | Reviewed patterns to allow trailing whitespace. 341 | 342 | 2013-11-13 Arnold D. Robbins 343 | 344 | * texiwebjr.twjr: Improve shell debugging. Start on changing 345 | duplicated code to instead use common chunks, after all this 346 | is Literate Programming. Some prose reformatting and 347 | clean up. Fix up menus via prepinfo. 348 | 349 | 2013-11-12 Arnold D. Robbins 350 | 351 | * texiwebjr.twjr: Fix a number of problems in jrtangle and 352 | lots of progress on jrweave. Use braces for file chunks. 353 | Allow printing of initial setup script. Add debugging of shell 354 | scripts (could use more work). Add more stuff to consider 355 | doing. Also a fair amount of prose cleanups. 356 | 357 | 2013-11-11 Arnold D. Robbins 358 | 359 | * texiwebjr.twjr: jrweave done enough to produce a reasonable 360 | looking document. Lots of cleanup left to do, as well as 361 | dumping the cross references. 362 | 363 | Fix up printing of leading macros; remove the original ones. 364 | 365 | 2013-11-10 Arnold D. Robbins 366 | 367 | * texiwebjr.twjr: jrweave done enough that what it produces 368 | can be formatted with TeX. Still lots to go. 369 | 370 | 2013-11-08 Arnold D. Robbins 371 | 372 | * texiwebjr.twjr: Pretty much finished the full jrtangle, 373 | and also adding placeholders for additional chapters. 374 | 375 | 2013-11-07 Arnold D. Robbins 376 | 377 | * texiwebjr.twjr: Misc minor changes. Some serious ones blown 378 | away by accidentally doing them in the .texi file. Duh. 379 | 380 | 2013-11-06 Arnold D. Robbins 381 | 382 | * texiwebjr.twjr: More improvements in jrtangle, especially 383 | towards post-processing. Preprocessing step added. 384 | * bootstrapping: New directory with simple bootstrapping scripts. 385 | This may go away eventually. 386 | 387 | 2013-11-05 Arnold D. Robbins 388 | 389 | * texiwebjr.twjr: Initial git checkin. Bootstrap of jrtangle 390 | was accomplished on 2013-11-04. 391 | * texinfo.tex: Initial checkin. 392 | * COPYING: Initial checkin. 393 | * README: Added, before push to github. 394 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Sat Feb 20 20:26:12 IST 2016 2 | ============================ 3 | 4 | The code extracted from texiwebjr.twjr (jrtangle and jrweave) are 5 | Copyright (C) 2013, 2014, 2015, 2016 by Arnold David Robbins and published 6 | under the terms of the GNU General Public License, version 3. A copy of 7 | this license may found in the file COPYING. 8 | 9 | The explanatory prose and text in texiwebjr.twjr are Copyright (C) 2013, 10 | 2014, 2015, 2016 by Arnold David Robbins. As of Edition 0.95, they 11 | are also published under the terms of the GNU General Public License, 12 | version 3. 13 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # Copyright (C) 2013, 2014, 2015, 2016, 2019, 2024 Arnold David Robbins 3 | # 4 | # This file is part of TexiWeb Jr., a literate programming system. 5 | # 6 | # TexiWeb Jr. is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3 of the License, or 9 | # (at your option) any later version. 10 | # 11 | # TexiWeb Jr. is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program; if not, write to the Free Software 18 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 19 | 20 | # FIXME: Maybe make the Makefile depend on the .twjr file. 21 | # FIXME: Run xmllint on the xml file. 22 | 23 | SOURCE = texiwebjr.twjr 24 | TEXISOURCE = texiwebjr.texi 25 | 26 | all: jrweave jrtangle pdf docbook html info 27 | 28 | jrweave jrtangle: $(SOURCE) 29 | ./bootstrapping/jrtangle0 $(SOURCE) 30 | 31 | $(TEXISOURCE): $(SOURCE) jrweave 32 | ./jrweave $(SOURCE) > $(TEXISOURCE) 33 | 34 | pdf: texiwebjr.pdf 35 | 36 | texiwebjr.pdf: $(TEXISOURCE) 37 | texi2dvi --pdf --batch --build-dir=texiwebjr.t2p \ 38 | -o texiwebjr.pdf texiwebjr.texi 39 | 40 | docbook: texiwebjr.xml 41 | 42 | texiwebjr.xml: $(TEXISOURCE) 43 | makeinfo --docbook $(TEXISOURCE) 44 | 45 | dbpdf: docbook 46 | fop -xml texiwebjr.xml -pdf texiwebjr-fop.pdf -xsl /usr/share/xml/docbook/stylesheet/docbook-xsl/fo/docbook.xsl 47 | 48 | html: texiwebjr.html 49 | 50 | texiwebjr.html: $(TEXISOURCE) 51 | makeinfo --no-split --html $(TEXISOURCE) 52 | 53 | info: texiwebjr.info 54 | 55 | texiwebjr.info: $(TEXISOURCE) 56 | makeinfo --no-split $(TEXISOURCE) 57 | 58 | clean: 59 | rm -f texiwebjr.html texiwebjr.info texiwebjr.xml 60 | rm -f texiwebjr.texi texiwebjr.pdf 61 | rm -fr texiwebjr.t2p 62 | 63 | distclean: clean 64 | rm jrweave jrtangle Makefile 65 | -------------------------------------------------------------------------------- /Notes/footnote-style.mbx: -------------------------------------------------------------------------------- 1 | From bwk@cs.princeton.edu Thu Nov 28 21:28:14 2013 2 | Return-Path: 3 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 4 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rASJR40U010794 5 | for ; Thu, 28 Nov 2013 21:28:13 +0200 6 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 7 | frenzy.freefriends.org 8 | X-Spam-Level: 9 | X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, 10 | RP_MATCHES_RCVD autolearn=ham version=3.3.1 11 | X-Envelope-From: bwk@cs.princeton.edu 12 | X-Envelope-To: 13 | Received: from frenzy.freefriends.org [66.54.153.139] 14 | by skeeve.com with IMAP (fetchmail-6.3.21) 15 | for (single-drop); Thu, 28 Nov 2013 21:28:13 +0200 (IST) 16 | Received: from redflag.CS.Princeton.EDU (redflag.CS.Princeton.EDU [128.112.136.72]) 17 | by freefriends.org (8.14.6/8.14.6) with ESMTP id rARGLX16032198 18 | for ; Wed, 27 Nov 2013 09:21:36 -0700 19 | Received: from tux.CS.Princeton.EDU (tux.CS.Princeton.EDU [128.112.155.166]) 20 | (authenticated bits=0) 21 | by redflag.CS.Princeton.EDU (8.13.8/8.13.8) with ESMTP id rARGLWoP023709 22 | (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NOT) 23 | for ; Wed, 27 Nov 2013 11:21:32 -0500 24 | Date: Wed, 27 Nov 2013 11:21:32 -0500 (EST) 25 | From: Brian Kernighan 26 | To: arnold@skeeve.com 27 | Subject: Re: a simple style question 28 | In-Reply-To: <201311271242.rARCgUgK019666@freefriends.org> 29 | Message-ID: 30 | References: <201311271242.rARCgUgK019666@freefriends.org> 31 | User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) 32 | MIME-Version: 1.0 33 | Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed 34 | Status: RO 35 | 36 | It's pretty unwise to take my answer as authoritative. I can't 37 | find anything specific in either the Chicago Manual of Style nor 38 | Words Into Type (my two reference sources for such matters), but 39 | examples in the latter suggest that the second form (comma before 40 | superscript) is the right one. I also looked at some legal documents, 41 | and they too put the reference after the punctuation. In the absence 42 | of actual knowledge, that's what I would go with. 43 | 44 | Brian 45 | 46 | On Wed, 27 Nov 2013, arnold@skeeve.com wrote: 47 | 48 | > Writing style, not coding style. 49 | > 50 | > Should footnote numbers be inside or outside punctuation, such as 51 | > periods or commas? 52 | > 53 | > This is great[1], 54 | > or 55 | > Ths is great,[1] 56 | > 57 | > 58 | > where [1] represents the small elevated footnote number in typeset 59 | > material. 60 | > 61 | > I have some documents where I need to make this consistent... 62 | > 63 | > Much thanks, 64 | > 65 | > Arnold 66 | > 67 | 68 | -------------------------------------------------------------------------------- /Notes/oldstyle.txt: -------------------------------------------------------------------------------- 1 | for oldstlye 2 | 3 | @tex 4 | \gdef\oldnum#1{\begingroup\oldstyle #1\endgroup}% 5 | @end tex 6 | -------------------------------------------------------------------------------- /Notes/stuff-ownership.mbx: -------------------------------------------------------------------------------- 1 | From karl@freefriends.org Tue Nov 5 19:16:28 2013 2 | Return-Path: 3 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 4 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2) with ESMTP id rA5HGOZT004839 5 | for ; Tue, 5 Nov 2013 19:16:28 +0200 6 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 7 | frenzy.freefriends.org 8 | X-Spam-Level: 9 | X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 10 | autolearn=ham version=3.3.1 11 | X-Envelope-From: karl@freefriends.org 12 | X-Envelope-To: 13 | Received: from frenzy.freefriends.org [66.54.153.139] 14 | by skeeve.com with IMAP (fetchmail-6.3.21) 15 | for (single-drop); Tue, 05 Nov 2013 19:16:28 +0200 (IST) 16 | Received: from freefriends.org (localhost [127.0.0.1]) 17 | by freefriends.org (8.14.6/8.14.6) with ESMTP id rA4NTmBL010765 18 | for ; Mon, 4 Nov 2013 16:29:49 -0700 19 | Received: (from nobody@localhost) 20 | by freefriends.org (8.14.6/8.14.6/submit) id rA4NTm4G010764; 21 | Mon, 4 Nov 2013 23:29:48 GMT 22 | Date: Mon, 4 Nov 2013 23:29:48 GMT 23 | Message-Id: <201311042329.rA4NTm4G010764@freefriends.org> 24 | X-Authentication-Warning: frenzy.freefriends.org: nobody set sender to karl@freefriends.org using -f 25 | From: karl@freefriends.org (Karl Berry) 26 | To: arnold@skeeve.com 27 | Subject: Re: question about ownership 28 | In-Reply-To: <201311041514.rA4FEjJP015964@freefriends.org> 29 | Status: R 30 | 31 | doc to the FSF, I can also make use of code / doc for my own things, right? 32 | 33 | Yes. 34 | 35 | There is a "grant back" in the standard assignment text which allows you 36 | to use your own work under any terms, without limitation. 37 | 38 | Do I need to notify the FSF? 39 | 40 | Nope. 41 | 42 | k 43 | 44 | -------------------------------------------------------------------------------- /Notes/texinfo-macros.mbx: -------------------------------------------------------------------------------- 1 | From karl@freefriends.org Thu Nov 28 21:27:47 2013 2 | Return-Path: 3 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 4 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rASJR40A010794 5 | for ; Thu, 28 Nov 2013 21:27:47 +0200 6 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 7 | frenzy.freefriends.org 8 | X-Spam-Level: 9 | X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 10 | autolearn=ham version=3.3.1 11 | X-Envelope-From: karl@freefriends.org 12 | X-Envelope-To: 13 | Received: from frenzy.freefriends.org [66.54.153.139] 14 | by skeeve.com with IMAP (fetchmail-6.3.21) 15 | for (single-drop); Thu, 28 Nov 2013 21:27:47 +0200 (IST) 16 | Received: from freefriends.org (localhost [127.0.0.1]) 17 | by freefriends.org (8.14.6/8.14.6) with ESMTP id rAQIXPHe028752 18 | for ; Tue, 26 Nov 2013 11:33:26 -0700 19 | Received: (from nobody@localhost) 20 | by freefriends.org (8.14.6/8.14.6/submit) id rAQIXP5C028751; 21 | Tue, 26 Nov 2013 18:33:25 GMT 22 | Date: Tue, 26 Nov 2013 18:33:25 GMT 23 | Message-Id: <201311261833.rAQIXP5C028751@freefriends.org> 24 | X-Authentication-Warning: frenzy.freefriends.org: nobody set sender to karl@freefriends.org using -f 25 | MIME-Version: 1.0 26 | Content-Type: multipart/mixed; boundary="Oc7O1UE6Me" 27 | Content-Transfer-Encoding: 7bit 28 | From: karl@freefriends.org (Karl Berry) 29 | To: arnold@skeeve.com 30 | Subject: url style, colors 31 | Status: RO 32 | 33 | 34 | --Oc7O1UE6Me 35 | Content-Type: text/plain; charset=us-ascii 36 | Content-Description: message body text 37 | Content-Transfer-Encoding: 7bit 38 | 39 | Hi Arnold, 40 | 41 | I committed a new texinfo.tex (also attached) which always uses the 42 | "DVI" style for @uref and always prints in black. If one actually wants 43 | color, e.g., 44 | @tex 45 | \gdef\urlcolor{1 0 0}% red 46 | \gdef\linkcolor{0 0 1}% blue 47 | @end tex 48 | 49 | I'll test and document that in a bit, but just thought you might want to 50 | try the code before I push it out. 51 | 52 | Thanks, 53 | k 54 | 55 | 56 | --Oc7O1UE6Me 57 | Content-Type: application/octet-stream 58 | Content-Disposition: attachment; 59 | filename="texinfo.tex.gz" 60 | Content-Transfer-Encoding: base64 61 | 62 | 63 | --Oc7O1UE6Me-- 64 | 65 | From karl@freefriends.org Fri Nov 29 13:00:50 2013 66 | Return-Path: 67 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 68 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rATB0YSD002477 69 | for ; Fri, 29 Nov 2013 13:00:50 +0200 70 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 71 | frenzy.freefriends.org 72 | X-Spam-Level: 73 | X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 74 | autolearn=ham version=3.3.1 75 | X-Envelope-From: karl@freefriends.org 76 | X-Envelope-To: 77 | Received: from frenzy.freefriends.org [66.54.153.139] 78 | by skeeve.com with IMAP (fetchmail-6.3.21) 79 | for (single-drop); Fri, 29 Nov 2013 13:00:50 +0200 (IST) 80 | Received: from freefriends.org (localhost [127.0.0.1]) 81 | by freefriends.org (8.14.6/8.14.6) with ESMTP id rASN1XGl007315 82 | for ; Thu, 28 Nov 2013 16:01:33 -0700 83 | Received: (from nobody@localhost) 84 | by freefriends.org (8.14.6/8.14.6/submit) id rASN1XVf007314; 85 | Thu, 28 Nov 2013 23:01:33 GMT 86 | Date: Thu, 28 Nov 2013 23:01:33 GMT 87 | Message-Id: <201311282301.rASN1XVf007314@freefriends.org> 88 | X-Authentication-Warning: frenzy.freefriends.org: nobody set sender to karl@freefriends.org using -f 89 | From: karl@freefriends.org (Karl Berry) 90 | To: arnold@skeeve.com 91 | Subject: Re: url style, colors 92 | In-Reply-To: <201311280815.rAS8F1uL002576@freefriends.org> 93 | Status: RO 94 | 95 | So there's no way to get the embedded link style anymore? 96 | 97 | There's another "secret" option for that. 98 | @tex 99 | \global\urefurlonlylinktrue 100 | @end tex 101 | 102 | Happy Thanksgiving, 103 | 104 | You too :). 105 | 106 | k 107 | 108 | From karl@freefriends.org Thu Dec 19 23:02:55 2013 109 | Return-Path: 110 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 111 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id rBJL2naH002762 112 | for ; Thu, 19 Dec 2013 23:02:54 +0200 113 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 114 | frenzy.freefriends.org 115 | X-Spam-Level: 116 | X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 117 | autolearn=ham version=3.3.1 118 | X-Envelope-From: karl@freefriends.org 119 | X-Envelope-To: 120 | Received: from frenzy.freefriends.org [66.54.153.139] 121 | by skeeve.com with IMAP (fetchmail-6.3.21) 122 | for (single-drop); Thu, 19 Dec 2013 23:02:54 +0200 (IST) 123 | Received: from freefriends.org (localhost [127.0.0.1]) 124 | by freefriends.org (8.14.6/8.14.6) with ESMTP id rBIL8HQi023109 125 | for ; Wed, 18 Dec 2013 14:08:17 -0700 126 | Received: (from nobody@localhost) 127 | by freefriends.org (8.14.6/8.14.6/submit) id rBIL8Hpp023108; 128 | Wed, 18 Dec 2013 21:08:17 GMT 129 | Date: Wed, 18 Dec 2013 21:08:17 GMT 130 | Message-Id: <201312182108.rBIL8Hpp023108@freefriends.org> 131 | X-Authentication-Warning: frenzy.freefriends.org: nobody set sender to karl@freefriends.org using -f 132 | From: karl@freefriends.org (Karl Berry) 133 | To: arnold@skeeve.com 134 | Subject: Re: how to use @need? 135 | In-Reply-To: <201312182020.rBIKKIbm012579@skeeve.com> 136 | Status: RO 137 | 138 | Is there an easy way to translate "mils" into "lines"? 139 | 140 | Nothing's easy, exactly, but you could do @showthe@baselineskip to see 141 | the line spacing and then do the multiplication. 142 | E.g., if the line spacing is 12pt, that's 1/6 in, so 143 | 2 lines = 1/3 inch = 333 mil? 144 | (Depends on if you're using @smallbook, @fontsize, etc.) 145 | 146 | "I need at least the following N lines to 147 | be kept together and not broken across a page". 148 | 149 | @group? 150 | 151 | Mils (1/1000 of an inch?) seems a funny unit to have to work in. 152 | 153 | It's completely bogus IMHO. Chassell invented it back in the early 154 | days, for no good reason that I know of. 155 | 156 | However, since @need (and @group) are relatively rarely used, and even 157 | less actually needed, I'm not so inclined to worry about improving the 158 | units. 159 | 160 | k 161 | 162 | From karl@freefriends.org Thu Jan 9 05:49:49 2014 163 | Return-Path: 164 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 165 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id s093niF0006561 166 | for ; Thu, 9 Jan 2014 05:49:49 +0200 167 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 168 | frenzy.freefriends.org 169 | X-Spam-Level: 170 | X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 171 | autolearn=ham version=3.3.1 172 | X-Envelope-From: karl@freefriends.org 173 | X-Envelope-To: 174 | Received: from frenzy.freefriends.org [66.54.153.139] 175 | by skeeve.com with IMAP (fetchmail-6.3.21) 176 | for (single-drop); Thu, 09 Jan 2014 05:49:49 +0200 (IST) 177 | Received: from freefriends.org (localhost [127.0.0.1]) 178 | by freefriends.org (8.14.6/8.14.6) with ESMTP id s08MGDgc016117 179 | for ; Wed, 8 Jan 2014 15:16:13 -0700 180 | Received: (from nobody@localhost) 181 | by freefriends.org (8.14.6/8.14.6/submit) id s08MGDeA016116; 182 | Wed, 8 Jan 2014 22:16:13 GMT 183 | Date: Wed, 8 Jan 2014 22:16:13 GMT 184 | Message-Id: <201401082216.s08MGDeA016116@freefriends.org> 185 | X-Authentication-Warning: frenzy.freefriends.org: nobody set sender to karl@freefriends.org using -f 186 | From: karl@freefriends.org (Karl Berry) 187 | To: arnold@skeeve.com 188 | Subject: Re: texinfo thought.... 189 | In-Reply-To: <201401081222.s08CMhwQ016505@freefriends.org> 190 | Status: RO 191 | 192 | Is there a way to get control of the total text of an internal link? 193 | 194 | No. Sorry. 195 | 196 | I suppose it could be done. If you want to try, the macro for cross ref 197 | output is \xrefX. It would be similar to the way I put 198 | \ifurefurlonlylink into \urefbreakfinish for @url. I just can't deal 199 | with it any time soon. 200 | 201 | k 202 | 203 | From aharon.robbins@intel.com Sun Jan 12 19:45:34 2014 204 | Return-Path: 205 | Received: from skeeve.com (skeeve.com [127.0.0.1]) 206 | by skeeve.com (8.14.4/8.14.4/Debian-2ubuntu2.1) with ESMTP id s0CHjDDg004511 207 | for ; Sun, 12 Jan 2014 19:45:33 +0200 208 | X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on 209 | frenzy.freefriends.org 210 | X-Spam-Level: 211 | X-Spam-Status: No, score=-7.0 required=5.0 tests=BAYES_00,HTML_MESSAGE, 212 | RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD autolearn=ham version=3.3.1 213 | X-Envelope-From: aharon.robbins@intel.com 214 | X-Envelope-To: 215 | Received: from frenzy.freefriends.org [66.54.153.139] 216 | by skeeve.com with IMAP (fetchmail-6.3.21) 217 | for (single-drop); Sun, 12 Jan 2014 19:45:33 +0200 (IST) 218 | Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) 219 | by freefriends.org (8.14.6/8.14.6) with ESMTP id s0CDvgVS023086 220 | for ; Sun, 12 Jan 2014 06:57:45 -0700 221 | Received: from fmsmga002.fm.intel.com ([10.253.24.26]) 222 | by fmsmga101.fm.intel.com with ESMTP; 12 Jan 2014 05:57:41 -0800 223 | X-ExtLoop1: 1 224 | X-IronPort-AV: E=Sophos;i="4.95,647,1384329600"; 225 | d="scan'208,217";a="463906915" 226 | Received: from fmsmsx105.amr.corp.intel.com ([10.19.9.36]) 227 | by fmsmga002.fm.intel.com with ESMTP; 12 Jan 2014 05:57:41 -0800 228 | Received: from FMSMSX110.amr.corp.intel.com (10.18.116.10) by 229 | FMSMSX105.amr.corp.intel.com (10.19.9.36) with Microsoft SMTP Server (TLS) id 230 | 14.3.123.3; Sun, 12 Jan 2014 05:57:40 -0800 231 | Received: from hasmsx152.ger.corp.intel.com (10.184.195.15) by 232 | fmsmsx110.amr.corp.intel.com (10.18.116.10) with Microsoft SMTP Server (TLS) 233 | id 14.3.123.3; Sun, 12 Jan 2014 05:57:41 -0800 234 | Received: from hasmsx105.ger.corp.intel.com ([169.254.1.235]) by 235 | HASMSX152.ger.corp.intel.com ([169.254.3.66]) with mapi id 14.03.0123.003; 236 | Sun, 12 Jan 2014 15:57:39 +0200 237 | From: "Robbins, Aharon" 238 | To: "Aharon Robbins (arnold@skeeve.com)" 239 | Subject: smaller fonts 240 | Thread-Topic: smaller fonts 241 | Thread-Index: Ac8Pnj4YrECOJtgSTK2Vbc0yJD+hvQ== 242 | Date: Sun, 12 Jan 2014 13:57:38 +0000 243 | Message-ID: 244 | Accept-Language: en-US 245 | Content-Language: en-US 246 | X-MS-Has-Attach: 247 | X-MS-TNEF-Correlator: 248 | x-originating-ip: [10.184.70.12] 249 | Content-Type: multipart/alternative; 250 | boundary="_000_E29EA7F8F823E941A1E6EFBF1425792A3882883CHASMSX105gercor_" 251 | MIME-Version: 1.0 252 | Status: RO 253 | 254 | --_000_E29EA7F8F823E941A1E6EFBF1425792A3882883CHASMSX105gercor_ 255 | Content-Type: text/plain; charset="windows-1255" 256 | MIME-Version: 1.0 257 | Content-Transfer-Encoding: base64 258 | 259 | U29tZSB0ZXh0LgpAc21hbGxmb250cyBAcm0KU29tZSBzbWFsbGVyIHRleHQuCkB0ZXh0Zm9udHMg 260 | QHJtClNvbWUgYmlnZ2VyIHRleHQuCgpBaGFyb24gKEFybm9sZCkgUm9iYmlucwpJU0RDIC8gVlBH 261 | LCBKZXJ1c2FsZW0sIElzcmFlbApFbWFpbDogUGljayBvbmU6ICBBaGFyb24uUm9iYmluc0BpbnRl 262 | bC5jb208bWFpbHRvOkFoYXJvbi5Sb2JiaW5zQGludGVsLmNvbT4gICBvciBBcm5vbGQuUm9iYmlu 263 | c0BpbnRlbC5jb208bWFpbHRvOkFybm9sZC5Sb2JiaW5zQGludGVsLmNvbT4KTGlua3M6ICBNeSBJ 264 | bnRlbCBCbG9nPGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYmxvZ3MvYXV0aG9yL2Fo 265 | YXJvbi1yb2JiaW5zPiAgIE15IFBlcnNvbmFsIEhvbWUgUGFnZTxodHRwOi8vd3d3LnNrZWV2ZS5j 266 | b20vPiAgVW5peCAvIExpbnV4IEJvb2tzIEkndmUgV3JpdHRlbiAodmlhIEFtYXpvbi5jb20pPGh0 267 | dHA6Ly93d3cuYW1hem9uLmNvbS9Bcm5vbGQtUm9iYmlucy9lL0IwMDFJR0xWVjIvcmVmPWVwX3Nw 268 | cmtsX2F0X0IwMDFJR0xWVjI/cGZfcmRfcD00NzgyNjk2OTEmcGZfcmRfcz1hdXRvLXNwYXJrbGUm 269 | cGZfcmRfdD0zMDEmcGZfcmRfaT1Bcm5vbGQlMjBSb2JiaW5zJnBmX3JkX209QVRWUERLSUtYMERF 270 | UiZwZl9yZF9yPTFCSEdIR1FUQkc0UkIzSlNOQVBaPiAgTXkgTGlua2VkIEluIFByb2ZpbGU8aHR0 271 | cDovL3d3dy5saW5rZWRpbi5jb20vaW4vYXJub2xkcm9iYmlucz4KQ3VycmVudCBGYXZvcml0ZSBR 272 | dW90ZTogWyBJbiBMaW51eCBlc3Mgdm9sdCBuaXNodCBnZXNjaGVpbiBdICjh7Onw5ffxIObkIOzg 273 | IOTp5CD35fjkKSAg4OnvIOzp8OX38SDy8SDl5eDs6CDw6fnoIOLy+enp7woKLS0tLS0tLS0tLS0t 274 | LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t 275 | CkludGVsIElzcmFlbCAoNzQpIExpbWl0ZWQKClRoaXMgZS1tYWlsIGFuZCBhbnkgYXR0YWNobWVu 276 | dHMgbWF5IGNvbnRhaW4gY29uZmlkZW50aWFsIG1hdGVyaWFsIGZvcgp0aGUgc29sZSB1c2Ugb2Yg 277 | dGhlIGludGVuZGVkIHJlY2lwaWVudChzKS4gQW55IHJldmlldyBvciBkaXN0cmlidXRpb24KYnkg 278 | b3RoZXJzIGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIElmIHlvdSBhcmUgbm90IHRoZSBpbnRlbmRl 279 | ZApyZWNpcGllbnQsIHBsZWFzZSBjb250YWN0IHRoZSBzZW5kZXIgYW5kIGRlbGV0ZSBhbGwgY29w 280 | aWVzLgo= 281 | 282 | --_000_E29EA7F8F823E941A1E6EFBF1425792A3882883CHASMSX105gercor_ 283 | Content-Type: text/html; charset="windows-1255" 284 | MIME-Version: 1.0 285 | Content-Transfer-Encoding: base64 286 | 287 | PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy 288 | bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt 289 | YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj 290 | cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv 291 | VFIvUkVDLWh0bWw0MCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNv 292 | bnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTUiPgo8bWV0YSBuYW1lPSJHZW5l 293 | cmF0b3IiIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDE0IChmaWx0ZXJlZCBtZWRpdW0pIj4KPHN0 294 | eWxlPjwhLS0KLyogRm9udCBEZWZpbml0aW9ucyAqLwpAZm9udC1mYWNlCgl7Zm9udC1mYW1pbHk6 295 | Q2FsaWJyaTsKCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30KLyogU3R5bGUgRGVmaW5p 296 | dGlvbnMgKi8KcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAoJe21hcmdp 297 | bjowaW47CgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cglmb250LXNpemU6MTEuMHB0OwoJZm9udC1m 298 | YW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjt9CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsK 299 | CXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjpibHVlOwoJdGV4dC1kZWNvcmF0aW9uOnVu 300 | ZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBlcmxpbmtGb2xsb3dlZAoJe21zby1zdHls 301 | ZS1wcmlvcml0eTo5OTsKCWNvbG9yOnB1cnBsZTsKCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7 302 | fQpzcGFuLkVtYWlsU3R5bGUxNwoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsLWNvbXBvc2U7Cglm 303 | b250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiOwoJY29sb3I6d2luZG93dGV4dDt9Ci5N 304 | c29DaHBEZWZhdWx0Cgl7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7Cglmb250LWZhbWlseToi 305 | Q2FsaWJyaSIsInNhbnMtc2VyaWYiO30KQHBhZ2UgV29yZFNlY3Rpb24xCgl7c2l6ZTo4LjVpbiAx 306 | MS4waW47CgltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjt9CmRpdi5Xb3JkU2VjdGlv 307 | bjEKCXtwYWdlOldvcmRTZWN0aW9uMTt9Ci0tPjwvc3R5bGU+PCEtLVtpZiBndGUgbXNvIDldPjx4 308 | bWw+CjxvOnNoYXBlZGVmYXVsdHMgdjpleHQ9ImVkaXQiIHNwaWRtYXg9IjEwMjYiIC8+CjwveG1s 309 | PjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgo8bzpzaGFwZWxheW91dCB2OmV4 310 | dD0iZWRpdCI+CjxvOmlkbWFwIHY6ZXh0PSJlZGl0IiBkYXRhPSIxIiAvPgo8L286c2hhcGVsYXlv 311 | dXQ+PC94bWw+PCFbZW5kaWZdLS0+CjwvaGVhZD4KPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9ImJs 312 | dWUiIHZsaW5rPSJwdXJwbGUiPgo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPgo8cCBjbGFzcz0i 313 | TXNvTm9ybWFsIj5Tb21lIHRleHQuPG86cD48L286cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwi 314 | PkBzbWFsbGZvbnRzIEBybTxvOnA+PC9vOnA+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj5Tb21l 315 | IHNtYWxsZXIgdGV4dC48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+QHRleHRm 316 | b250cyBAcm08bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+U29tZSBiaWdnZXIg 317 | dGV4dC48bzpwPjwvbzpwPjwvcD4KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286 318 | cD48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5B 319 | aGFyb24gKEFybm9sZCkgUm9iYmluczxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9Ik1z 320 | b05vcm1hbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPklTREMgLyBWUEcsIEplcnVzYWxl 321 | bSwgSXNyYWVsPG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh 322 | biBzdHlsZT0iY29sb3I6IzFGNDk3RCI+RW1haWw6IFBpY2sgb25lOiZuYnNwOyA8YSBocmVmPSJt 323 | YWlsdG86QWhhcm9uLlJvYmJpbnNAaW50ZWwuY29tIj4KPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUi 324 | PkFoYXJvbi5Sb2JiaW5zQGludGVsLmNvbTwvc3Bhbj48L2E+Jm5ic3A7Jm5ic3A7IG9yIDxhIGhy 325 | ZWY9Im1haWx0bzpBcm5vbGQuUm9iYmluc0BpbnRlbC5jb20iPgo8c3BhbiBzdHlsZT0iY29sb3I6 326 | Ymx1ZSI+QXJub2xkLlJvYmJpbnNAaW50ZWwuY29tPC9zcGFuPjwvYT48bzpwPjwvbzpwPjwvc3Bh 327 | bj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjojMUY0OTdEIj5M 328 | aW5rczombmJzcDsgPGEgaHJlZj0iaHR0cDovL3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9ibG9n 329 | cy9hdXRob3IvYWhhcm9uLXJvYmJpbnMiPgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+TXkgSW50 330 | ZWwgQmxvZzwvc3Bhbj48L2E+Jm5ic3A7Jm5ic3A7IDxhIGhyZWY9Imh0dHA6Ly93d3cuc2tlZXZl 331 | LmNvbS8iPgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+TXkgUGVyc29uYWwgSG9tZSBQYWdlPC9z 332 | cGFuPjwvYT4mbmJzcDsgPGEgaHJlZj0iaHR0cDovL3d3dy5hbWF6b24uY29tL0Fybm9sZC1Sb2Ji 333 | aW5zL2UvQjAwMUlHTFZWMi9yZWY9ZXBfc3Bya2xfYXRfQjAwMUlHTFZWMj9wZl9yZF9wPTQ3ODI2 334 | OTY5MSZhbXA7cGZfcmRfcz1hdXRvLXNwYXJrbGUmYW1wO3BmX3JkX3Q9MzAxJmFtcDtwZl9yZF9p 335 | PUFybm9sZCUyMFJvYmJpbnMmYW1wO3BmX3JkX209QVRWUERLSUtYMERFUiZhbXA7cGZfcmRfcj0x 336 | QkhHSEdRVEJHNFJCM0pTTkFQWiI+CjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5Vbml4IC8gTGlu 337 | dXggQm9va3MgSSd2ZSBXcml0dGVuICh2aWEgQW1hem9uLmNvbSk8L3NwYW4+PC9hPiZuYnNwOwo8 338 | YSBocmVmPSJodHRwOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9hcm5vbGRyb2JiaW5zIj48c3BhbiBz 339 | dHlsZT0iY29sb3I6Ymx1ZSI+TXkgTGlua2VkIEluIFByb2ZpbGU8L3NwYW4+PC9hPgo8bzpwPjwv 340 | bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJjb2xvcjoj 341 | MUY0OTdEIj5DdXJyZW50IEZhdm9yaXRlIFF1b3RlOiBbIEluIExpbnV4IGVzcyB2b2x0IG5pc2h0 342 | IGdlc2NoZWluIF0KPC9zcGFuPjxzcGFuIGRpcj0iUlRMIj48L3NwYW4+PHNwYW4gZGlyPSJSVEwi 343 | Pjwvc3Bhbj48c3BhbiBsYW5nPSJIRSIgZGlyPSJSVEwiIHN0eWxlPSJmb250LWZhbWlseTomcXVv 344 | dDtUaW1lcyBOZXcgUm9tYW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+ 345 | PHNwYW4gZGlyPSJSVEwiPjwvc3Bhbj48c3BhbiBkaXI9IlJUTCI+PC9zcGFuPijh7Onw5ffxIObk 346 | IOzgIOTp5CD35fjkKQo8L3NwYW4+PHNwYW4gZGlyPSJMVFIiPjwvc3Bhbj48c3BhbiBkaXI9IkxU 347 | UiI+PC9zcGFuPjxzcGFuIGxhbmc9IkhFIiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PHNwYW4gZGly 348 | PSJMVFIiPjwvc3Bhbj48c3BhbiBkaXI9IkxUUiI+PC9zcGFuPiZuYnNwOzwvc3Bhbj48c3BhbiBs 349 | YW5nPSJIRSIgZGlyPSJSVEwiIHN0eWxlPSJmb250LWZhbWlseTomcXVvdDtUaW1lcyBOZXcgUm9t 350 | YW4mcXVvdDssJnF1b3Q7c2VyaWYmcXVvdDs7Y29sb3I6IzFGNDk3RCI+4OnvIOzp8OX38SDy8SDl 351 | 5eDs6CDw6fnoIOLy+enp7zwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6IzFGNDk3RCI+PG86cD48 352 | L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBkaXI9IlJUTCI+PC9z 353 | cGFuPjxzcGFuIGRpcj0iUlRMIj48L3NwYW4+PHNwYW4gZGlyPSJSVEwiIHN0eWxlPSJmb250LWZh 354 | bWlseTomcXVvdDtBcmlhbCZxdW90OywmcXVvdDtzYW5zLXNlcmlmJnF1b3Q7O2NvbG9yOiMxRjQ5 355 | N0QiPjxzcGFuIGRpcj0iUlRMIj48L3NwYW4+PHNwYW4gZGlyPSJSVEwiPjwvc3Bhbj48L3NwYW4+ 356 | PHNwYW4gc3R5bGU9ImNvbG9yOiMxRjQ5N0QiPjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xh 357 | c3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+CjwvZGl2Pgo8cD4tLS0tLS0tLS0t 358 | LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t 359 | LS08YnI+CkludGVsIElzcmFlbCAoNzQpIExpbWl0ZWQ8L3A+Cgo8cD5UaGlzIGUtbWFpbCBhbmQg 360 | YW55IGF0dGFjaG1lbnRzIG1heSBjb250YWluIGNvbmZpZGVudGlhbCBtYXRlcmlhbCBmb3I8YnI+ 361 | CnRoZSBzb2xlIHVzZSBvZiB0aGUgaW50ZW5kZWQgcmVjaXBpZW50KHMpLiBBbnkgcmV2aWV3IG9y 362 | IGRpc3RyaWJ1dGlvbjxicj4KYnkgb3RoZXJzIGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIElmIHlv 363 | dSBhcmUgbm90IHRoZSBpbnRlbmRlZDxicj4KcmVjaXBpZW50LCBwbGVhc2UgY29udGFjdCB0aGUg 364 | c2VuZGVyIGFuZCBkZWxldGUgYWxsIGNvcGllcy48L3A+PC9ib2R5Pgo8L2h0bWw+Cg== 365 | 366 | --_000_E29EA7F8F823E941A1E6EFBF1425792A3882883CHASMSX105gercor_-- 367 | 368 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | Fri Feb 19 12:07:09 IST 2016 2 | ============================ 3 | 4 | This is TexiWeb Jr., a super simple literate programming system built 5 | on top of Texinfo and implemented in awk. 6 | 7 | The "tangle" piece was successfully bootstrapped on November 4, 2013. 8 | The "weave" piece started producing a reasonable-looking document 9 | on November 11, 2013. 10 | 11 | As of today, both the source code and literate programming document 12 | are licensed under the GNU GPL. See the file COPYING. 13 | 14 | Enjoy, 15 | 16 | Arnold Robbins 17 | arnold AT skeeve.com 18 | -------------------------------------------------------------------------------- /bootstrapping/ChangeLog: -------------------------------------------------------------------------------- 1 | 2019-03-27 Arnold D. Robbins 2 | 3 | * jrtangle0: Change #! path to gawk to /usr/bin/gawk. 4 | 5 | 2013-11-12 Arnold D. Robbins 6 | 7 | * jrtangle0: Allow duplicating a referenced chunk in a callling 8 | chunk (recursive expansion management). 9 | 10 | 2013-11-08 Arnold D. Robbins 11 | 12 | * jrtangle0: Bug fix for lines with multiple chunks. 13 | * jrweave0: Print out a "do not edit" warning to avoid confusion. 14 | 15 | 2013-11-07 Arnold D. Robbins 16 | 17 | * jrweave0: Allow for @post_create. 18 | 19 | 2013-11-06 Arnold D. Robbins 20 | 21 | * jrtangle0, jrweave0, makepdf0: Bootstrapping scripts. 22 | -------------------------------------------------------------------------------- /bootstrapping/jrtangle0: -------------------------------------------------------------------------------- 1 | #! /usr/bin/gawk -f 2 | 3 | # This file is part of TexiWeb Jr., a literate programming system. 4 | # 5 | # TexiWeb Jr. is free software; you can redistribute it and/or modify 6 | # it under the terms of the GNU General Public License as published by 7 | # the Free Software Foundation; either version 3 of the License, or 8 | # (at your option) any later version. 9 | # 10 | # TexiWeb Jr. is distributed in the hope that it will be useful, 11 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | # GNU General Public License for more details. 14 | # 15 | # You should have received a copy of the GNU General Public License 16 | # along with this program; if not, write to the Free Software 17 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 18 | 19 | # This file implements a simplified version of Ben Pfaff's TexiWeb language 20 | # which reads texiweb source and produces Texinfo for printing and C 21 | # output for code. 22 | # 23 | # TexiWeb is desirable for the following reasons: 24 | # 25 | # 1. It is based on Texinfo, which is the markup language I most prefer 26 | # after having used several such languages over the years. 27 | # 28 | # 2. It is for literate programming, which I think is the best way to 29 | # write large programs. 30 | # 31 | # I have chosen to reimplement his processor after being inspired by noweb 32 | # to be very minimalist. In particular, TexiWeb expects C code for the code 33 | # chunks and also does things like pretty printing and indexing. I prefer 34 | # code to look like code (constant-width font, no pretty printing) and I 35 | # want to be able to use any kind of code in my code chunks, including awk, 36 | # Makefiles, shell scripts, whatever. 37 | # 38 | # In addition, I think it's better for the author to do the indexing manually 39 | # than to rely on the literate programming tool, although that opinion may 40 | # change as this evolves. 41 | # 42 | # So, this is really just "inspired by" TexiWeb and not a reimplementation. 43 | # 44 | # This is the bootstrap version that just does the "tangle" function, which 45 | # is to extract source code chunks. See the TEXIWEB file for some minimal 46 | # documentation. I will write more once I have a working set of scripts. 47 | 48 | # FIXME: 49 | # DONE 1. Set up an array of line numbers to track open things like file 50 | # chunks, code chunks, ifweave, iftangle so that we can report that 51 | # they aren't closed. 52 | # DONE 2. Set up checks that ifweave/iftangle are not nested in each other. 53 | # 3. Set up a command to do noweb cpif functionality. 54 | # 4. Move different flags into an array, a la line numbers. 55 | 56 | # One nice thing in TexiWeb are @iftangle ... @end iftangle and 57 | # @ifweave ... @end ifweave bracketing commands. Those should be dealt 58 | # with early on. 59 | 60 | /^@ifweave[[:space:]]*$/, /^@end ifweave[[:space:]]*$/ { 61 | if ("iftangle" in Line_numbers) 62 | fatal(_"cannot nest @iftangle inside @ifweave\n"); 63 | 64 | # start of ifweave, save line number 65 | if (/^@ifweave[[:space:]]*$/) 66 | Line_numbers["ifweave"] = (FILENAME ":" FNR) 67 | 68 | # end of ifweave, delete line number 69 | if (/^@end ifweave[[:space:]]*$/) 70 | delete Line_numbers["ifweave"] 71 | 72 | # simply skip these lines, this is tangling 73 | next 74 | } 75 | 76 | # For tangling we remove the bracketing control lines and let anything 77 | # in between fall through. 78 | 79 | /^@iftangle[[:space:]]*$/, /^@end iftangle[[:space:]]*$/ { 80 | if ("ifweave" in Line_numbers) 81 | fatal(_"cannot nest @ifweave inside @iftangle\n"); 82 | 83 | # start of iftangle, save line number, skip this line 84 | if (/^@iftangle[[:space:]]*$/) { 85 | Line_numbers["iftangle"] = (FILENAME ":" FNR) 86 | next 87 | } 88 | 89 | # end of iftangle, delete line number, skip this line 90 | if (/^@end iftangle[[:space:]]*$/) { 91 | delete Line_numbers["iftangle"] 92 | next 93 | } 94 | 95 | # otherwise fall through into the rest of the code 96 | } 97 | 98 | # File chunks start with `@(filename.c) =' in column 1. Unlike TexiWeb and 99 | # like noweb, we don't require += to add more stuff to a definition. We 100 | # just use = and figure it out. File chunks end with a single @ on a line 101 | # by itself, with the @ in column 1. 102 | # 103 | # Instead of using a range pattern, we use a boolean flag; this lets us 104 | # avoid special-casing the first and last lines. 105 | 106 | $0 ~ File_chunk_pattern { 107 | new_file = gensub(File_chunk_pattern, "\\1", 1) 108 | if (Gathering_file) { 109 | fatal(_"file start of %s found while still collecting %s\n", 110 | Source_file, new_file) 111 | } 112 | check_unfinished() 113 | 114 | Gathering_file = TRUE 115 | Line_numbers["File_chunk"] = (FILENAME ":" FNR) 116 | Source_file = new_file 117 | 118 | if (Debug ~ /filename/) 119 | printf("saw new filename %s\n", Source_file) > "/dev/stderr" 120 | 121 | next 122 | } 123 | 124 | # The BEGIN rule sets up some constants. File_chunk_pattern is a variable since 125 | # it needs to be used for matching and with gensub(). This is better than repeating 126 | # it in the code. 127 | 128 | BEGIN { 129 | TRUE = 1 130 | FALSE = 0 131 | File_chunk_pattern = "^@\\(([^)]+)@\\)[[:space:]]*=[[:space:]]*$" 132 | } 133 | 134 | # Here is the @ sign that ends the input file. 135 | # It also ends code segments. 136 | 137 | /^@[[:space:]]*$/ { 138 | if (Gathering_file) 139 | end_file_gathering() 140 | else if (Gathering_code) 141 | end_code_gathering() 142 | else 143 | warning(_"unmatched terminating @-sign: ignored\n") 144 | 145 | next 146 | } 147 | 148 | # After some experimentation, things are simplest if file contents and 149 | # code chunks do NOT have the final terminating newline. Code that outputs 150 | # file contents must remember to add the final newline. 151 | 152 | # end_file_gathering ---finish up collecting a file 153 | 154 | function end_file_gathering() 155 | { 156 | Gathering_file = FALSE 157 | 158 | if (Source_file in File_contents) 159 | File_contents[Source_file] = File_contents[Source_file] "\n" File_lines 160 | else 161 | File_contents[Source_file] = File_lines 162 | 163 | File_lines = "" 164 | Line_numbers["File_chunk"] = "" 165 | 166 | if (Debug ~ /filename/) 167 | printf("finished collecting file %s\n", Source_file) > "/dev/stderr" 168 | } 169 | 170 | # Error checking: 171 | 172 | END { 173 | check_unfinished() 174 | } 175 | 176 | # check_unfinished --- print a fatal error when an unfinished code or 177 | # file section is detected. Also ifweave / iftangle. 178 | 179 | function check_unfinished() 180 | { 181 | if (Gathering_code) 182 | fatal(_"unfinished code section (started at %s)\n", 183 | Line_numbers["Code_chunk"]) 184 | else if (Gathering_file) 185 | fatal(_"unfinished file section (started at %s)\n", 186 | Line_numbers["File_chunk"]) 187 | 188 | if ("ifweave" in Line_numbers) 189 | fatal(_"unfinished @ifweave section (started at %s)\n", 190 | Line_numbers["ifweave"]) 191 | if ("iftangle" in Line_numbers) 192 | fatal(_"unfinished @iftangle section (started at %s)\n", 193 | Line_numbers["iftangle"]) 194 | } 195 | 196 | # And gathering up the file is simple. Collect each line and append it. 197 | # Any embedded code segments are expanded at the end. 198 | 199 | Gathering_file { 200 | if (File_lines == "") 201 | File_lines = $0 202 | else 203 | File_lines = File_lines "\n" $0 204 | } 205 | 206 | # A useful feature is to have the ability to do something to a file after it's 207 | # been created. For example to make a script file executable. 208 | 209 | /^@post_create[[:space:]]+/ { 210 | if (NF < 3) 211 | fatal(_"usage: @post_create filename command\n") 212 | check_unfinished() 213 | 214 | name = $2 215 | $1 = $2 = "" 216 | Post_create_commands[name] = $0 217 | } 218 | 219 | #--- # Along the same lines, we want to be able to update files 220 | #--- # only if they have changed. This is done in noweb by the "cpif" 221 | #--- # program which means "copy if changed". We will call it 222 | #--- # update_file and allow the user to replace it. 223 | #--- # 224 | #--- # Usage is 225 | #--- # @update_file [PATH] FILE [SUFFIX] 226 | #--- # Default path is "." 227 | #--- # Default suffix is ".tmp" 228 | #--- # 229 | #--- # This supplies a template that is then used for creating 230 | #--- # each file. Tangle substitutes the parameters in the 231 | #--- # recipe and executes the result, supplying the current 232 | #--- # filename for FILE. PATH and SUFFIX are fixed. 233 | #--- 234 | #--- /^@update_file/, /^@end update_file/ { 235 | #--- if (/^@update_file/) { 236 | #--- delete Update_file # starting over 237 | #--- 238 | #--- if (NF == 1) { 239 | #--- fatal(_"@update_file: missing parameters") 240 | #--- } else if (NF == 2) { 241 | #--- Update_file["path"] = "." 242 | #--- Udpate_file["filename"] = $2 243 | #--- Update_file["suffix"] = ".tmp" 244 | #--- } else if (NF == 3) { 245 | #--- Update_file["path"] = "." 246 | #--- Udpate_file["filename"] = $2 247 | #--- Update_file["suffix"] = ".tmp" 248 | #--- } else { 249 | #--- # NF >= 4 250 | #--- Update_file["path"] = $2 251 | #--- Udpate_file["filename"] = $3 252 | #--- Update_file["suffix"] = $4 253 | #--- if (NF > 4) 254 | #--- warning(_"@update_file: ignoring extra argurments") 255 | #--- } 256 | #--- 257 | #--- next 258 | #--- } 259 | #--- 260 | #--- if (/^@end update_file/) { 261 | #--- next 262 | #--- } 263 | #--- 264 | #--- if ("text" in Update_file) 265 | #--- Update_file["text"] = Update_file["text"] "\n" $0 266 | #--- else 267 | #--- Update_file["text"] = $0 268 | #--- } 269 | #--- 270 | #--- # Here are the defaults for Update_file 271 | #--- 272 | #--- BEGIN { 273 | #--- Update_file["path"] = "FULLPATH" 274 | #--- Update_file["filename"] = "FILENAME" 275 | #--- Update_file["suffix"] = ".tmp" 276 | #--- Update_file["text"] = \ 277 | #--- "if [ -f FULLPATH/FILENAME ]\n" \ 278 | #--- "then\n" \ 279 | #--- "\tif cmp FULLPATH/FILENAME.tmp FULLPATH/FILENAME > /dev/null\n" \ 280 | #--- "\tthen\n" \ 281 | #--- "\t\trm FULLPATH/FILENAME.tmp\n" \ 282 | #--- "\telse\n" \ 283 | #--- "\t\tmv FULLPATH/FILENAME.tmp FULLPATH/FILENAME\n" \ 284 | #--- "\tfi\n" \ 285 | #--- "else\n" \ 286 | #--- "\tmv FULLPATH/FILENAME.tmp FULLPATH/FILENAME\n" \ 287 | #--- "fi\n" 288 | #--- 289 | #--- if (Debug ~ /shell/) 290 | #--- Update_file["text"] = "set -x; " Update_file["text"] 291 | #--- } 292 | #--- 293 | # create_file_update_values --- take a filename and return strings 294 | 295 | function create_file_update_values(filename, results, dir, command) 296 | { 297 | delete results 298 | 299 | # determine directory 300 | # dir = ... 301 | results["destination"] = dir "/" filename Update_file["suffix"] 302 | command = Update_file["text"] 303 | gsub(Update_file["filename"], filename, command) 304 | # gsub(Update_file["suffix"], filename, command) 305 | gsub(Update_file["path"], dir, command) 306 | results["command"] = command 307 | } 308 | 309 | # Code chunks are like file chunks. They start with @ = 310 | # and end with a standalone @ sign. The logic and handling are similar 311 | # to what we just did for files. 312 | 313 | BEGIN { 314 | Code_chunk_pattern = "^@" "<(.+)" "@>[[:space:]]*=[[:space:]]*$" 315 | } 316 | 317 | $0 ~ Code_chunk_pattern { 318 | new_code = gensub(Code_chunk_pattern, "\\1", 1) 319 | if (Gathering_code) { 320 | fatal(_"code start of %s found while still collecting %s\n", 321 | Code_chunk, new_code) 322 | } 323 | check_unfinished() 324 | 325 | Gathering_code = TRUE 326 | Code_chunk = new_code 327 | Line_numbers["Code_chunk"] = (FILENAME ":" FNR) 328 | 329 | if (Debug ~ /code/) 330 | printf("saw new code chunk %s\n", Code_chunk) > "/dev/stderr" 331 | 332 | next 333 | } 334 | 335 | # Gather up the code segment. 336 | # Any embedded code segments are expanded at the end. 337 | 338 | Gathering_code { 339 | if (Code_lines == "") 340 | Code_lines = $0 341 | else 342 | Code_lines = Code_lines "\n" $0 343 | } 344 | 345 | function end_code_gathering() 346 | { 347 | Gathering_code = FALSE 348 | 349 | if (Code_chunk in Code_contents) 350 | Code_contents[Code_chunk] = Code_contents[Code_chunk] "\n" Code_lines 351 | else 352 | Code_contents[Code_chunk] = Code_lines 353 | 354 | Code_lines = "" 355 | Code_chunk_start = "" 356 | 357 | if (Debug ~ /code/) 358 | printf("finished collecting code %s\n", Code_chunk) > "/dev/stderr" 359 | } 360 | 361 | # Finishing off code is similarly easy. 362 | 363 | END { 364 | dump_filenames() 365 | 366 | if (Debug ~ /code/) 367 | dump_chunks() 368 | } 369 | 370 | # dump_filenames --- create files and update them as needed 371 | 372 | function dump_filenames( i, s, update_values) 373 | { 374 | for (i in File_contents) { 375 | s = expand_code_chunks(File_contents[i]) 376 | create_file_update_values(i, update_values) 377 | 378 | # printf("%s\n", s) > update_values["destination"] 379 | # close(update_values["destination"]) 380 | 381 | printf("%s\n", s) > i 382 | close(i) 383 | 384 | # cpif the file 385 | # system(update_values["command"]) 386 | 387 | if (i in Post_create_commands) 388 | system(Post_create_commands[i]) 389 | } 390 | } 391 | 392 | function dump_chunks( i) 393 | { 394 | for (i in Code_contents) 395 | printf("@<%s@>=\n%s@\n\n", i, Code_contents[i]) > "/dev/stderr" 396 | } 397 | 398 | # strip_out_name --- get the name from @ 399 | 400 | function strip_out_name(name, l) 401 | { 402 | l = length(name) 403 | name = substr(name, 3, l - 4) 404 | 405 | return name 406 | } 407 | 408 | # code_body --- get the code body associated with @ 409 | 410 | function code_body(name, l) 411 | { 412 | return Code_contents[strip_out_name(name)] 413 | } 414 | 415 | # expand_code_chunks --- expand embedded code chunks. this is the hard part 416 | 417 | function expand_code_chunks(contents) 418 | { 419 | delete Currently_expanding 420 | 421 | return do_expand_code_chunks(contents) 422 | } 423 | 424 | function do_expand_code_chunks(contents, nlines, lines, results, i, j) 425 | { 426 | nlines = split(contents, lines, "\n") 427 | 428 | for (i = 1; i <= nlines; i++) { 429 | if (lines[i] !~ /@<.*@>/) { 430 | results[i] = lines[i] 431 | } else 432 | results[i] = expand_one_line(lines[i]) 433 | } 434 | 435 | return join(results, 1, nlines, "\n") 436 | } 437 | 438 | # expand_one_line --- expand a line with code chunk references 439 | 440 | function expand_one_line(input_line, parts, chunk_names, nparts, num_names, code_lines, i, j) 441 | { 442 | nparts = split(input_line, parts, Chunk_name_pattern, chunk_names) 443 | num_names = length(chunk_names) 444 | 445 | # error checking 446 | for (i = 1; i <= num_names; i++) { 447 | j = strip_out_name(chunk_names[i]) 448 | if (! (j in Code_contents)) 449 | fatal(_"expand_one_line: code chunk `%s' used but not defined\n", 450 | chunk_names[i]); 451 | if (j in Currently_expanding) 452 | fatal(_"expand_one_line: code chunk `%s' expands itself recursively\n", 453 | chunk_names[i]) 454 | else 455 | Currently_expanding[j]++ 456 | } 457 | 458 | code_lines = code_body(chunk_names[1]) 459 | delete Currently_expanding[strip_out_name(chunk_names[1])] 460 | 461 | if (input_line !~ ("^" Chunk_name_pattern)) { 462 | if (parts[1] ~ /^[[:space:]]+$/) { 463 | # insert leading white space on all lines to get indentation 464 | gsub(/^|\n/, ("&" parts[1]), code_lines) 465 | } else { 466 | code_lines = parts[1] code_lines 467 | } 468 | } 469 | 470 | for (i = 2; i <= nparts; i++) { 471 | code_lines = code_lines parts[i] 472 | if (i in chunk_names) { 473 | code_lines = code_lines code_body(chunk_names[i]) 474 | delete Currently_expanding[strip_out_name(chunk_names[1])] 475 | } 476 | } 477 | 478 | if (code_lines ~ Chunk_name_pattern) 479 | return do_expand_code_chunks(code_lines) # get any further code chunks, recursively 480 | else 481 | return code_lines 482 | } 483 | 484 | BEGIN { 485 | Chunk_name_pattern = "@<[^>]+@>" 486 | } 487 | 488 | # Helper functions 489 | 490 | # message --- write a particular kind of message out to stderr 491 | # 492 | function message(msg, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 493 | { 494 | printf("%s:%d: %s: " format, FILENAME, FNR, msg, 495 | a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) > "/dev/stderr" 496 | exit 1 497 | } 498 | 499 | # fatal --- print a fatal error message and exit. 500 | # No varargs, so fake it with lots of parameters. 501 | 502 | function fatal(format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 503 | { 504 | message(_"fatal", format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 505 | exit 1 506 | } 507 | 508 | # warning --- print a warning message to stderr 509 | # No varargs, so fake it with lots of parameters. 510 | 511 | function warning(format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 512 | { 513 | message("_warning", format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 514 | } 515 | 516 | # expand_tabs --- expand tabs in the string 517 | 518 | function expand_tabs(string, tabstop, chars, out, i, j, n) 519 | { 520 | if (tabstop < 2) 521 | fatal(_"expand_tabs: tabstop %d < 2\n", tabstop) 522 | 523 | n = split(string, chars, "") 524 | j = 0 525 | for (i = 1; i <= n;) { 526 | if (chars[i] != "\t") { 527 | out[j++] = chars[i++] 528 | continue 529 | } 530 | i++ # skip the tab 531 | 532 | do { 533 | out[j++] = " " 534 | } while (and(j, tabstop-1) != 0) 535 | } 536 | 537 | return join(out, 0, j, SUBSEP) 538 | } 539 | 540 | # join.awk --- join an array into a string 541 | # 542 | # Arnold Robbins, arnold@skeeve.com, Public Domain 543 | # May 1993 544 | 545 | function join(array, start, end, sep, result, i) 546 | { 547 | if (sep == "") 548 | sep = " " 549 | else if (sep == SUBSEP) # magic value 550 | sep = "" 551 | result = array[start] 552 | for (i = start + 1; i <= end; i++) 553 | result = result sep array[i] 554 | return result 555 | } 556 | 557 | # NOTES: 558 | # 1. Several gawkisms: 559 | # A. gensub 560 | # B. four argument split 561 | # C. Bitwise and() function 562 | # D. Translatable strings 563 | -------------------------------------------------------------------------------- /bootstrapping/jrweave0: -------------------------------------------------------------------------------- 1 | #! /usr/local/bin/gawk -f 2 | 3 | # Copyright (C) 2013 Arnold David Robbins 4 | # 5 | # This file is part of TexiWeb Jr., a literate programming system. 6 | # 7 | # TexiWeb Jr. is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # TexiWeb Jr. is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program; if not, write to the Free Software 19 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 20 | 21 | BEGIN { 22 | print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" 23 | print "% DO NOT EDIT THIS FILE!!!! %" 24 | print "% It was created by jrweave. Edit the %" 25 | print "% original .twjr file instead!!! %" 26 | print "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" 27 | } 28 | 29 | # For tangling we skip everything 30 | 31 | /^@iftangle[[:space:]]*$/, /^@end iftangle[[:space:]]*$/ { 32 | if ("ifweave" in Line_numbers) 33 | fatal(_"cannot nest @ifweave inside @iftangle\n"); 34 | 35 | # start of ifweave, save line number 36 | if (/^@ifweave[[:space:]]*$/) 37 | Line_numbers["iftangle"] = (FILENAME ":" FNR) 38 | 39 | # end of ifweave, delete line number 40 | if (/^@end ifweave[[:space:]]*$/) 41 | delete Line_numbers["iftangle"] 42 | 43 | # simply skip these lines, this is tangling 44 | next 45 | } 46 | 47 | # For weaving we remove the bracketing control lines and let anything 48 | # in between fall through. 49 | 50 | /^@ifweave[[:space:]]*$/, /^@end ifweave[[:space:]]*$/ { 51 | if ("iftangle" in Line_numbers) 52 | fatal(_"cannot nest @iftangle inside @ifweave\n"); 53 | 54 | # start of iftangle, save line number, skip this line 55 | if (/^@iftangle[[:space:]]*$/) { 56 | Line_numbers["ifweave"] = (FILENAME ":" FNR) 57 | next 58 | } 59 | 60 | # end of iftangle, delete line number, skip this line 61 | if (/^@end iftangle[[:space:]]*$/) { 62 | delete Line_numbers["ifweave"] 63 | next 64 | } 65 | 66 | # otherwise fall through into the rest of the code 67 | } 68 | 69 | /^@post_create/ { next } 70 | 71 | # File chunks start with "@(filename.c) =" in column 1. Unlike TexiWeb and 72 | # like noweb, we dont require += to add more stuff to a definition. We 73 | # just use = and figure it out. File chunks end with a single @ on a line 74 | # by itself, with the @ in column 1. 75 | # 76 | # Instead of using a range pattern, we use a boolean flag; this lets us 77 | # avoid special-casing the first and last lines. 78 | 79 | $0 ~ File_chunk_pattern { 80 | print "@example" 81 | x = gensub(/[@{}]/, "@&", "g") 82 | print x 83 | 84 | new_file = gensub(File_chunk_pattern, "\\1", 1) 85 | if (Gathering_file) { 86 | fatal(_"file start of %s found while still collecting %s\n", 87 | Source_file, new_file) 88 | } 89 | check_unfinished() 90 | 91 | Gathering_file = TRUE 92 | Line_numbers["File_chunk"] = (FILENAME ":" FNR) 93 | Source_file = new_file 94 | 95 | if (Debug ~ /filename/) 96 | printf("saw new filename %s\n", Source_file) > "/dev/stderr" 97 | 98 | next 99 | } 100 | 101 | # The BEGIN rule sets up some constants. File_chunk_pattern is a variable since 102 | # it needs to be used for matching and with gensub(). This is better than repeating 103 | # it in the code. 104 | 105 | BEGIN { 106 | TRUE = 1 107 | FALSE = 0 108 | File_chunk_pattern = "^@\\(([^)]+)@\\)[[:space:]]*=[[:space:]]*$" 109 | } 110 | 111 | # Here is the @ sign that ends the input file. 112 | # It also ends code segments. 113 | 114 | /^@[[:space:]]*$/ { 115 | if (Gathering_file) 116 | end_file_gathering() 117 | else if (Gathering_code) 118 | end_code_gathering() 119 | else 120 | warning(_"unmatched terminating @-sign: ignored\n") 121 | 122 | next 123 | } 124 | 125 | # After some experimentation, things are simplest if file contents and 126 | # code chunks do NOT have the final terminating newline. Code that outputs 127 | # file contents must remember to add the final newline. 128 | 129 | # end_file_gathering ---finish up collecting a file 130 | 131 | function end_file_gathering() 132 | { 133 | Gathering_file = FALSE 134 | 135 | # print the file 136 | x = expand_tabs(File_lines, 4) 137 | print gensub(/[@{}]/, "@&", "g", x) 138 | print "@@" 139 | print "@end example" 140 | 141 | File_lines = "" 142 | Line_numbers["File_chunk"] = "" 143 | 144 | if (Debug ~ /filename/) 145 | printf("finished collecting file %s\n", Source_file) > "/dev/stderr" 146 | } 147 | 148 | # Error checking: 149 | 150 | END { 151 | check_unfinished() 152 | } 153 | 154 | # check_unfinished --- print a fatal error when an unfinished code or 155 | # file section is detected. Also ifweave / iftangle. 156 | 157 | function check_unfinished() 158 | { 159 | if (Gathering_code) 160 | fatal(_"unfinished code section (started at %s)\n", 161 | Line_numbers["Code_chunk"]) 162 | else if (Gathering_file) 163 | fatal(_"unfinished file section (started at %s)\n", 164 | Line_numbers["File_chunk"]) 165 | 166 | if ("ifweave" in Line_numbers) 167 | fatal(_"unfinished @ifweave section (started at %s)\n", 168 | Line_numbers["ifweave"]) 169 | if ("iftangle" in Line_numbers) 170 | fatal(_"unfinished @iftangle section (started at %s)\n", 171 | Line_numbers["iftangle"]) 172 | } 173 | 174 | # And gathering up the file is simple. Collect each line and append it. 175 | # Any embedded code segments are expanded at the end. 176 | 177 | Gathering_file { 178 | if (File_lines == "") 179 | File_lines = $0 180 | else 181 | File_lines = File_lines "\n" $0 182 | 183 | next 184 | } 185 | 186 | 187 | BEGIN { 188 | Code_chunk_pattern = "^@" "<(.+)" "@>[[:space:]]*=[[:space:]]*$" 189 | } 190 | 191 | $0 ~ Code_chunk_pattern { 192 | print "@example" 193 | x = gensub(/[@{}]/, "@&", "g") 194 | print x 195 | 196 | new_code = gensub(Code_chunk_pattern, "\\1", 1) 197 | if (Gathering_code) { 198 | fatal(_"code start of %s found while still collecting %s\n", 199 | Code_chunk, new_code) 200 | } 201 | check_unfinished() 202 | 203 | Gathering_code = TRUE 204 | Code_chunk = new_code 205 | Line_numbers["Code_chunk"] = (FILENAME ":" FNR) 206 | 207 | if (Debug ~ /code/) 208 | printf("saw new code chunk %s\n", Code_chunk) > "/dev/stderr" 209 | 210 | next 211 | } 212 | 213 | # Gather up the code segment. 214 | # Any embedded code segments are expanded at the end. 215 | 216 | Gathering_code { 217 | if (Code_lines == "") 218 | Code_lines = $0 219 | else 220 | Code_lines = Code_lines "\n" $0 221 | next 222 | } 223 | 224 | function end_code_gathering() 225 | { 226 | Gathering_code = FALSE 227 | 228 | # print the code 229 | x = expand_tabs(Code_lines, 4) 230 | print gensub(/[@{}]/, "@&", "g", x) 231 | 232 | print "@@" 233 | print "@end example" 234 | 235 | Code_lines = "" 236 | Code_chunk_start = "" 237 | 238 | if (Debug ~ /code/) 239 | printf("finished collecting code %s\n", Code_chunk) > "/dev/stderr" 240 | } 241 | 242 | BEGIN { 243 | Chunk_name_pattern = "@<[^>]+@>" 244 | } 245 | 246 | { print } 247 | 248 | # Helper functions 249 | 250 | # message --- write a particular kind of message out to stderr 251 | # 252 | function message(msg, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 253 | { 254 | printf("%s:%d: %s: " format, FILENAME, FNR, msg, 255 | a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) > "/dev/stderr" 256 | exit 1 257 | } 258 | 259 | # fatal --- print a fatal error message and exit. 260 | # No varargs, so fake it with lots of parameters. 261 | 262 | function fatal(format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 263 | { 264 | message(_"fatal", format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 265 | exit 1 266 | } 267 | 268 | # warning --- print a warning message to stderr 269 | # No varargs, so fake it with lots of parameters. 270 | 271 | function warning(format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 272 | { 273 | message(_"warning", format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) 274 | } 275 | 276 | # expand_tabs --- expand tabs in the string 277 | 278 | function expand_tabs(string, tabstop, chars, out, i, j, k, n) 279 | { 280 | if (tabstop < 2) 281 | fatal(_"expand_tabs: tabstop %d < 2\n", tabstop) 282 | 283 | n = split(string, chars, "") 284 | j = k = 0 285 | for (i = 1; i <= n;) { 286 | if (chars[i] == "\n") { 287 | out[j++] = chars[i++] 288 | k = 0 289 | continue 290 | } 291 | 292 | if (chars[i] != "\t") { 293 | out[j++] = chars[i++] 294 | k++ 295 | continue 296 | } 297 | i++ # skip the tab 298 | 299 | do { 300 | out[j++] = " " 301 | k++ 302 | } while (and(k, tabstop-1) != 0) 303 | } 304 | 305 | return join(out, 0, j, SUBSEP) 306 | } 307 | 308 | # join.awk --- join an array into a string 309 | # 310 | # Arnold Robbins, arnold@skeeve.com, Public Domain 311 | # May 1993 312 | 313 | function join(array, start, end, sep, result, i) 314 | { 315 | if (sep == "") 316 | sep = " " 317 | else if (sep == SUBSEP) # magic value 318 | sep = "" 319 | result = array[start] 320 | for (i = start + 1; i <= end; i++) 321 | result = result sep array[i] 322 | return result 323 | } 324 | -------------------------------------------------------------------------------- /bootstrapping/makepdf0: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | # Copyright (C) 2013 Arnold David Robbins 4 | # 5 | # This file is part of TexiWeb Jr., a literate programming system. 6 | # 7 | # TexiWeb Jr. is free software; you can redistribute it and/or modify 8 | # it under the terms of the GNU General Public License as published by 9 | # the Free Software Foundation; either version 3 of the License, or 10 | # (at your option) any later version. 11 | # 12 | # TexiWeb Jr. is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU General Public License 18 | # along with this program; if not, write to the Free Software 19 | # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 20 | 21 | texi2dvi --pdf --batch --build-dir=texiwebjr.t2p -o texiwebjr.pdf \ 22 | texiwebjr.texi 23 | -------------------------------------------------------------------------------- /template.twjr: -------------------------------------------------------------------------------- 1 | % Template .twjr file. 2 | % Uncomment the 1st \input line if you need the MF logo 3 | % \input mftmac % for Metafont logo 4 | \input texinfo @c -*-texinfo-*- 5 | @c vim: filetype=texinfo tabstop=4 shiftwidth=4 6 | @c %**start of header (This is for running Texinfo on a region.) 7 | @setfilename FOO.info 8 | @settitle Put Your Title Here 9 | @c %**end of header (This is for running Texinfo on a region.) 10 | 11 | @c Change how xref titles are quoted. 12 | @dquotexrefs 13 | @ifclear FORPRINT 14 | @pdflinkcolor 15 | @urllinkcolor 16 | @hideurls 17 | @end ifclear 18 | 19 | 20 | @c The following information should be updated here only! 21 | @c This sets the edition of the document. 22 | 23 | @c These apply across the board. 24 | @set UPDATE-MONTH MONTH, YYYY 25 | @set EDITION 0.n 26 | 27 | @set TITLE Long Title Here 28 | @set SHORTTITLE Short Title Here 29 | 30 | @iftex 31 | @set DOCUMENT book 32 | @set CHAPTER chapter 33 | @set APPENDIX appendix 34 | @set SECTION section 35 | @set SUBSECTION subsection 36 | @end iftex 37 | @ifhtml 38 | @set DOCUMENT Web page 39 | @set CHAPTER chapter 40 | @set APPENDIX appendix 41 | @set SECTION section 42 | @set SUBSECTION subsection 43 | @end ifhtml 44 | @ifinfo 45 | @set DOCUMENT Info file 46 | @set CHAPTER major node 47 | @set APPENDIX major node 48 | @set SECTION minor node 49 | @set SUBSECTION node 50 | @end ifinfo 51 | @ifdocbook 52 | @set DOCUMENT book 53 | @set CHAPTER chapter 54 | @set APPENDIX appendix 55 | @set SECTION section 56 | @set SUBSECTION subsection 57 | @end ifdocbook 58 | 59 | @c some special symbols 60 | @ifnottex 61 | @macro ii{text} 62 | @i{\text\} 63 | @end macro 64 | @end ifnottex 65 | 66 | @c Uncomment this if you want the metafont logo. 67 | @ignore 68 | @ifnottex 69 | @macro MF{} 70 | @sc{METAFONT} 71 | @end macro 72 | @end ifnottex 73 | @end ignore 74 | 75 | @c merge the function and variable indexes into the concept index 76 | @c do so without the code font, and in the index entries do the 77 | @c font management ourselves. Also merge in the chunk definition 78 | @c and reference entries, which jrweave creates for us. 79 | @ifnothtml 80 | @synindex fn cp 81 | @synindex vr cp 82 | @synindex cd cp 83 | @synindex cr cp 84 | @end ifnothtml 85 | 86 | @c If "finalout" is commented out, the printed output will show 87 | @c black boxes that mark lines that are too long. Thus, it is 88 | @c unwise to comment it out when running a master in case there are 89 | @c overfulls which are deemed okay. 90 | 91 | @iftex 92 | @c @finalout 93 | @end iftex 94 | 95 | @copying 96 | @docbook 97 | Published by: 98 | 99 | Full Name 100 | Address Line 1 101 | Address Line 2 102 | etc. 103 | Email: user@@example.com 104 | URL: https://www.example.com/ 105 | 106 | Copyright © YYYY, YYYY 107 | Full name here 108 | All Rights Reserved. 109 | @end docbook 110 | 111 | @ifnotdocbook 112 | Copyright @copyright{} YYYY, YYYY @* 113 | Full name here @* 114 | All Rights Reserved. 115 | @end ifnotdocbook 116 | @sp 1 117 | The FOO program is copyright 118 | @copyright{} YYYY, YYYY by Full name here. It is published under 119 | the conditions of the GNU General Public License, version 3. 120 | @sp 2 121 | This is Edition @value{EDITION} of @cite{@value{TITLE}}. 122 | @end copying 123 | 124 | @c Uncomment this for the release. Leaving it off saves paper 125 | @c during editing and review. 126 | @c @setchapternewpage odd 127 | 128 | @c Uncomment this if it's ever printed as a real book(let). 129 | @c @shorttitlepage @value{SHORTTITLE} 130 | 131 | @titlepage 132 | @title @value{TITLE} 133 | @subtitle @value{UPDATE-MONTH} 134 | @author Full Name here 135 | 136 | @ifnotdocbook 137 | @c Include the Distribution inside the titlepage environment so 138 | @c that headings are turned off. Headings on and off do not work. 139 | 140 | @page 141 | @vskip 0pt plus 1filll 142 | Published by: 143 | @sp 1 144 | Full name here @* 145 | Address Line 1 @* 146 | Address Line 2 @* 147 | etc. @* 148 | Email: @EMAIL{user@@example.com,user AT example.com} @* 149 | URL: @url{https://www.example.com/} @* 150 | 151 | @insertcopying 152 | @end ifnotdocbook 153 | @end titlepage 154 | 155 | @set DRAFT @i{DRAFT} 156 | 157 | @iftex 158 | @headings off 159 | @evenheading @thispage @| @value{DRAFT} @| @strong{@value{SHORTTITLE}} 160 | @oddheading @strong{@thischapter} @| @value{DRAFT} @| @thispage 161 | @end iftex 162 | 163 | @ifnottex 164 | @ifnotdocbook 165 | @ifnotxml 166 | @node Top 167 | @top General Introduction 168 | @c Preface node should come right after the Top 169 | @c node, in `unnumbered' sections, then the introductory chapter. 170 | @c Licensing nodes are appendices, they're not central to TexiWebJr. 171 | 172 | This file documents YOUR PROGRAM, a program that does WHATEVER. 173 | 174 | @insertcopying 175 | @end ifnotxml 176 | @end ifnotdocbook 177 | @end ifnottex 178 | 179 | @menu 180 | @detailmenu 181 | @end detailmenu 182 | @end menu 183 | 184 | @c @summarycontents 185 | @contents 186 | 187 | @c Add these to the menu if they ever get included. 188 | @c @node Foreword 189 | @c @unnumbered Foreword 190 | 191 | @node Preface 192 | @unnumbered Preface 193 | 194 | Text here. 195 | 196 | @menu 197 | * Audience:: Who should read this @value{DOCUMENT}. 198 | * Overview:: An overview of the @value{DOCUMENT}. 199 | * Conventions:: Typographical conventions. 200 | * Acknowledgements:: Acknowledgements. 201 | @end menu 202 | 203 | @node Audience 204 | @unnumberedsec Intended Audience 205 | 206 | Text here. 207 | 208 | 209 | @node Overview 210 | @unnumberedsec What Is Covered 211 | 212 | Text and chapter by chapter description here. 213 | 214 | @node Conventions 215 | @unnumberedsec Typographical Conventions 216 | 217 | @c Copied mostly verbatim from the gawk manual. 218 | 219 | @cindex Texinfo document formatting language 220 | This @value{DOCUMENT} is written in an enhanced version of 221 | @uref{https://www.gnu.org/software/texinfo/, Texinfo}, 222 | the GNU documentation formatting language. 223 | A single Texinfo source file is used to produce both the printed and online 224 | versions of a program's documentation. 225 | @ifnotinfo 226 | Because of this, the typographical conventions 227 | are slightly different than in other books you may have read. 228 | @end ifnotinfo 229 | 230 | Examples you would type at the command-line are preceded by the common 231 | shell primary and secondary prompts, @samp{$} and @samp{>}. Input that 232 | you type is shown @kbd{like this}. Output from the command is preceded 233 | by the glyph ``@print{}''. This typically represents the command's 234 | standard output. Error messages, and other output on the command's 235 | standard error, are preceded by the glyph ``@error{}''. For example: 236 | 237 | @example 238 | $ @kbd{echo hi on stdout} 239 | @print{} hi on stdout 240 | $ @kbd{echo hello on stderr 1>&2} 241 | @error{} hello on stderr 242 | @end example 243 | 244 | @ifnotinfo 245 | In the text, command names appear in @code{this font}, while code segments 246 | appear in the same font and quoted, @samp{like this}. Options look 247 | like this: @option{-f}. Some things are emphasized @emph{like this}, 248 | and if a point needs to be made strongly, it is done @strong{like this}. 249 | The first occurrence of a new term is usually its @dfn{definition} and 250 | appears in the same font as the previous occurrence of ``definition'' 251 | in this sentence. Finally, file names are indicated like this: 252 | @file{/path/to/our/file}. 253 | @end ifnotinfo 254 | 255 | @node Acknowledgements 256 | @unnumberedsec Acknowledgements 257 | 258 | @node Introduction 259 | @chapter Introduction 260 | 261 | @node Next chapter 262 | @chapter Next Chapter Title 263 | 264 | @node First appendix 265 | @appendix First Appendix Title 266 | 267 | @node Code Chunk Summaries 268 | @appendix Code Chunk Summaries 269 | 270 | This @value{APPENDIX} presents alphabetical lists of 271 | all the file definitions, the code chunk definitions, 272 | and the code chunk references. 273 | 274 | @menu 275 | * File Definitions:: Source files by definition. 276 | * Code Chunk Definitions:: Code chunks by definition. 277 | * Code Chunk References:: Code chunks by reference. 278 | @end menu 279 | 280 | @node File Definitions 281 | @appendixsec Source File Definitions 282 | 283 | @print_file_defs 284 | 285 | @node Code Chunk Definitions 286 | @appendixsec Code Chunk Definitions 287 | 288 | @print_code_defs 289 | 290 | @node Code Chunk References 291 | @appendixsec Code Chunk References 292 | 293 | @print_code_refs 294 | 295 | @node Bibliography 296 | @unnumbered Bibliography 297 | 298 | @node Concept Index 299 | @unnumbered Index 300 | 301 | @printindex cp 302 | 303 | @bye 304 | 305 | TODO: 306 | -------------------------------------------------------------------------------- /texindex: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # $Id: texindex.in 6991 2016-02-06 12:16:13Z gavin $ 3 | # 4 | # Copyright 2015, 2016 Free Software Foundation, Inc. 5 | # 6 | # This program is free software; you can redistribute it and/or modify 7 | # it under the terms of the GNU General Public License as published by 8 | # the Free Software Foundation; either version 3 of the License, 9 | # or (at your option) any later version. 10 | # 11 | # This program is distributed in the hope that it will be useful, 12 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | # GNU General Public License for more details. 15 | # 16 | # You should have received a copy of the GNU General Public License 17 | # along with this program. If not, see . 18 | # 19 | # Originally written by Karl Berry. 20 | # Please send bug reports, etc. to bug-texinfo@gnu.org. 21 | # 22 | # Shell wrapper for the texindex.awk program. This is the most 23 | # convenient way to support --options; with a #! line, it is (g)awk 24 | # itself that interprets the options. We want texindex --version 25 | # to report texindex's version number, not gawk's. 26 | # 27 | # So our job here is to (a) find the awk interpreter, 28 | # and (b) find the texindex.awk script file. 29 | 30 | mydir=`cd \`dirname $0\` && pwd` 31 | 32 | # 33 | # allow user override for awk program location. 34 | awk_binary= 35 | awk_envvar=$TEXINDEX_AWK 36 | if test -n "$awk_envvar"; then 37 | if test -s "$awk_envvar"; then 38 | awk_binary=$awk_envvar 39 | else 40 | echo "$0: TEXINDEX_AWK environment variable set, but value" >&2 41 | echo "$0: is not a readable non-empty file; ignoring: $awk_envvar" >&2 42 | fi 43 | fi 44 | # 45 | # else use configured value for awk. 46 | if test -z "$awk_binary"; then 47 | awk_binary="gawk" 48 | fi 49 | # 50 | # that should never be empty, but just in case, else fall back to plain 51 | # "awk". (Let's not go to the trouble of searching PATH unless we get 52 | # reports of problems.) 53 | test -z "$awk_binary" && awk_binary=awk 54 | 55 | 56 | # 57 | # finding the texindex.awk script file ... 58 | ti_script= 59 | # 60 | # allow user override for script location: 61 | ti_envvar=$TEXINDEX_SCRIPT 62 | if test -n "$ti_envvar"; then 63 | if test -s "$ti_envvar"; then 64 | ti_script=$ti_envvar 65 | else 66 | echo "$0: TEXINDEX_SCRIPT environment variable set, but value" >&2 67 | echo "$0: is not a readable non-empty file; ignoring: $ti_script" >&2 68 | fi 69 | fi 70 | # 71 | # else if script is in the same directory as us (development tree), use it: 72 | test -z "$ti_script" && test -s "$mydir/texindex.awk" \ 73 | && ti_script=$mydir/texindex.awk 74 | # 75 | # else look for script in pkgdatadir. 76 | if test -z "$ti_script"; then 77 | pkgdatadir_configured="/usr/local/share/texinfo" 78 | test -s "$pkgdatadir_configured/texindex.awk" \ 79 | && ti_script=$pkgdatadir_configured/texindex.awk 80 | fi 81 | # 82 | # look relative to $mydir, to allow the installed tree to be moved. 83 | if test -z "$ti_script"; then 84 | relative_dir=$mydir/../share/texinfo 85 | test -d "$relative_dir" \ 86 | && test -s "$relative_dir/texindex.awk" \ 87 | && ti_script=$relative_dir/texindex.awk 88 | fi 89 | # 90 | # didn't find it, abort. 91 | if test -z "$ti_script"; then 92 | echo "$0: could not locate texindex.awk script file, quitting." >&2 93 | echo "$0: (checked envvar TEXINDEX_SCRIPT ($TEXINDEX_SCRIPT)," >&2 94 | echo "$0: executable dir ($mydir)," >&2 95 | echo "$0: share dir relative to binary ($relative_dir)," >&2 96 | echo "$0: and configured pkgdatadir ($pkgdatadir_configured).)" >&2 97 | exit 1 98 | fi 99 | 100 | # Suppose a symlink named a\tb (four chars) is made to this script, and 101 | # "a\tb" --help 102 | # is invoked. We want the output to report the program name as the 103 | # four chars a, \, t, b, not a, tab, b. 104 | # 105 | # But we pass the value using (g)awk -v, and (g)awk processes arguments 106 | # to -v for escape sequences, so that by the time the rest of the script 107 | # sees it, it has a tab in it. 108 | # 109 | # Conclusion: we must double any backslashes before invoking gawk, 110 | # by running the command: sed 's,\\,\\\\,g' 111 | # 112 | # Sadly, since we have to do this in a shell, we need twice 113 | # as many backslash characters in the input. Hope it's portable across 114 | # shells and seds. 115 | # 116 | escaped0=`echo "$0" | sed 's,\\\\,\\\\\\\\,g'` 117 | exec $awk_binary -v Invocation_name="$escaped0" -f "$ti_script" -- "$@" 118 | -------------------------------------------------------------------------------- /third_way.eps: -------------------------------------------------------------------------------- 1 | %!PS-Adobe-3.0 EPSF-3.0 2 | %%Pages: 1 3 | %%BoundingBox: 0 0 601 232 4 | %%DocumentData: Clean7Bit 5 | %%LanguageLevel: 2 6 | %%EndComments 7 | %%Page: 1 1 8 | save 9 dict begin 9 | {/T currentfile/ASCII85Decode filter def/DeviceGray setcolorspace 10 | /F T<>/LZWDecode filter def 11 | <> image 14 | F closefile T closefile} 15 | %%BeginData:; 16 | exec 17 | J,ffS#UC/p#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@#G\!<<-&dTL+h>q_R=AlC^cenm 18 | @96sNO'+94O[SBtqK3[GQ$8#0$s:dH%F"\YdnC/miamXmZ.;^gM+XHgVCRLW!Y<(gL*#*KS9:EL@fD="TbtjRX8%k'&bQcY.E(4;NQ 20 | @VpoHuH>4DtKWf`;[Tbnj2LA8@W0o.I!7d>WICC7!5d&[?pc!k[D[+9fliuKlBKLNC4duUdY_UW(K2 21 | %*7CHC@7-9k*lb"Y1=AtM#jC"/tA@-Z%m;9m$s[TP2;r"p,p*"J+nGlhA?5\hM#8'?ieVWT`C`>#QULt%L<.;5Um'B!9b2PT-u\(*_qP;I 24 | %uE%6$jduVX]CNQq"Xs"c!-BH5k,m=E8;Hiu;Z=+!=.Z!?/uJg2nQA!E`_DKqVTQL^4/->YR)7g41.h@,_`C*2`heJ"LB4l>moB6/ 26 | 6]*LT.Lo+i&Y`&q^1\?#ubuJrDaJ825i)Sk(7B(5CgN?ji^Gd+3E0@=)U'!!+8Z#6DY5(jqkZ.F<)S 27 | B2Rl<*sXOKI\i?*!(hh$@O!]OEM\#@ABKSJK_j]@,K4p!J)HQ3'IkH8+G 28 | S\RmsBGBV$Scno3,*EXE'T5p/E-"$nmd#\5A5Z?6DRV:;1W-)l3!4D@>a-OA\j:lbj9$&UZ"B.*`k, 29 | [_0-#_`>#$@\Nn0u@]F7a3K/)9-\,"+ak$5S=5$OBr%SW8Pa+"_%bX4L*!n71L^nagPZr:^RI?#f7^ 30 | K"JfURU_;Sp;=-<26#%6cQ0/Il#DaQ.cAs!d&[ZKr#3!^Fc6tq6?1Fl8cjjN8!!48MU$u+$.D3,DR[ 31 | aR*U1>-j#QOp]ib4&]G3Kn#EueYX<,)T0);2#577cUN+JT5ndNs[2k&_UJl*aoei.Q"<8AL,n^e@.Q 32 | Z'9`'&2=ZG7E-/gRch`h&VmoVE0nr 33 | NM)F75B!!&f3*oV'l"u6&bLBt4-d+/L/&-*=%,Y,Koc9;E*RHQ@MUD#W:G`5=EgN 35 | :,VS.JFoVQ35KR%[-0"F6+G2iaO5ZTJh_>68U#:#aM+nF(";$`kUg/\^pd"o\>7gqpHpmM;cNlc:$% 36 | juH$%N!`,s9#2:eX[c!-na&^`=Q5*LDja5X(j.g]>30)@h!A--.K?M'7NP#2+bjk6/U3?iUtYJT_n@ 37 | -ia65'N>Rq_`Ql\>9dXb@Z3%!1><':#JiYR'!abb!\1/m"8l=1iA1uM:dk?d<-5TMfd)SQbL(CbA0W"gPHk[Z[Y_%\0,W.j 40 | '"pkr0#dog$,%.?6+JQk[ORPdci2(b%eX"'S=HYKH+OGi&:cQi8;@pg4FKj0l<.G=N'$$B5$Gaa;J0 41 | 9(W"]4<8,OB]:=A10\=;2B%9Nr'UA0$_o#-i(Q.t""D->:3P[g"R$cC#1%QuDu^l*dr)X1^")BP!&1(,@.ZFV. 44 | XRF(^a?,\]+cC(?*N6[r<"7c_aa-!;MO_1c0$ml=6sK]2eNuF:uP;4gRcs?Bi*Mp2:;^0*1)\"Rrnc 45 | mab-/t[_N@m@t?crE7:U#g`q\$V/F'k!J@K6b2Js@/ekg!HNq4Lr2\=n$/ 49 | 7cW.'b*7HG#0:]%S>69V.j[NR&4Sn38"9Q'KGA3OO,+FRtP0@%6)QW%3[/t6\Q#<%OrK`!Pr.I+[2: 50 | W_OI`ElMeT'CamlA0YeCbFYQtESfn=D6X6o1cf4:u#03KFQp8VH2#XZGjGFaO$6T=)92'?2]O\f#\8 51 | <8.ppDY9-hLC<+HYNX/3SS!3#c-7@OM3gAulGd)o)Jk"=K;i*A8!9ip%"@K*2`c6]3b2%KtlM`:62h 52 | 9G8Pi;d,DZ9Fp'k!#&9U?uEPBOrW1L9a!9u*D5+Cs+P>**6nNa`2ME3Jk1P!(!;ma1)5o/PlD^7i;G 53 | 5SO[B^1/:[_%37_"_GQ;aq1"?a`P5Qg=*a(:="45ED1s87<`6shL%IIqQh$sY6@S>WE%*h.tk=I0f9 54 | &UYoCW3U3pe+/b:]Y#\)7&+,%naYJ0Z:2gL7sbR&@sr\JQNFC$8#GG%hRc;kWI5M(2ak<'KF'Bnq4% 55 | -\,1(#\4$q$!"D@U&-9tDf]4pS8>MHmRK>hi)%Hb*ifLf4.7<&'E-n3af_0`6;#(G2H+`n)L1%tD4[ 56 | _")!'X#]aWU\=''.^gK4"i=.7BhJAM(%6LoNlSpM0DdgH-hHnLG.?eeF=I)^&WANdq_M9F!%a+el*E 57 | !!&N^O(f%0A?;U8#3uO$;(!$1&>0TccqApe%W+H4'*&"d>K3DB+74U#KCQNGL;=<>0SUXGU#M"6OY@ 58 | @i!!3W#%(O*7rX/]+/<\u7-pl(T+eX3GN+14#KioQ#KCt?e"hYF4"$HVc,ZbU$&fG*(!#Gb4LC:r^! 59 | !i:p;LiEqOPu#67tPY/>AALOG8^fhua&?FWEdW!!h0i70R'!#=>Xo!!2e_^sHC%_iRlOYRic^-oqPV&Qtbn-mTq*V* 61 | m*g@6/%1!$e`Y!+?^BNhJ<[LhPXWA2M(5d8'\iGu#TY$kJnO/J-]6W 62 | (JKlX,=4@X=,$d-P8,7849,jh*!V2iRPJMA2^pEliFe\oU2'U)!!(I5ds-loJ:p#t+lJmn14]E*FoM 63 | YS.V-=c<#1,)#I65QE6kUo\cjnf/4^E+'kbHiOFK^-dTVXWc&!JW$m59<:2g[WbR4b0WFka^BWO 67 | :*bFPQrG,!HFQV$#^hl0WZcmP3=nPeh@d)j(Td]I(>!,L7J4>7L-s3k8sG([ABGCW\s*;4m"UN(E'n 68 | 5gP^5g5hjH5I+mHuZ;_RQ`K\FQK#/#"4Jea<>@O=HXTE'h%1f(aQ7dno:%LA"^&4[].i"XDMAOQJ_lK1R6f6i8'gk5%e#n5\8V&C%IY(ebQU!!#7i"p:QD5O"gD)?hN^7UQXn6 74 | g+LOA$(t-@K&Cn867Hf<0n([oL;(G!=.WXm\P7_?,b.j"!kV\OOEtjd&]tgilm8g)rqM'8HKpN+]6c 75 | f<'Q2[[c"5!+G$gtnQr.W&-;hcnramlbNap-[QBRaZ74$5hui3(b2`beRG&!:s$MIT@019A!Jch$#W 76 | P4kNTa,!8B?f.j>P8E6*MpIR/.J^^kRFA(X%o40J:Vh)%t[p6\L!n%[83VP.ag^KnU`pU%Eqsj@hpo 77 | 8M2]jqm<2dq?ol$Z;'7#WXl-/K?,H],TsEGOO-fu\$1GUhXc8J!*dgEGhsBL,UnPUdJu`ZGGKm!EsT 78 | WJ",CFi"6'#pP2YsS6.e@1,41AO0rc*r-kHc0YJh3^1e1"S%59%=AJ%475mLMl*97f_;%Z&QoXKHl, 79 | Nque&IefXD\CWC2$^f>AZ5g+.hCQh:skI-a*rAC!!,BF:881nYW`_.2ZNt+J7or9_"n+?!,_g-$pY= 80 | YTIg-DE=a9Y#2h]G!,;re\6sguIShUr0ba\NTmbl$%WHu%OUVBmI7(jOGd2E(0U<@@@h@QZ&5o,#!' 81 | h)LT,dnPDh/!Z0b4faP7eE6!O`h-d*`R$mJrOFJ`5&kOC/^Jg&q%s!!!K5nEpiG7TZ8e$\ig/`Acr 86 | =9PX:X="?;P?j_%$Sjf+TE[&?+h3`*mshFUr/l&7C+nd)BG!R$!$=Obk];d,l\,!"_t?&E"=[YqfO, 87 | $ig9cA3`&#&Ln=.M$>iH$o),pOJi>e6j1;aGi8c9J@GaRec@I0$dl#;&P*t)&ea^-@h>OL<.GP,&J" 88 | tU&eI,3^q([c"#PQ.#pgHBE0Q)C/QM:IPMrQSa.a[FmUHlq%;9_mf`[[D]PAW5&u,("!)&0I,7j:q$ 89 | NT9%-lN+$1]S)f'+hfd!-&!H8d5m)'tCX`5S4=u:C]('FB:7(,4HD*B,#=N&CIs"k5Gq>it+Ve&E%S 90 | Ynnn\P"qQ6m#r%GIJCK4Ursc3\SIkrmTHfj:SJ#n*'#<`9E#A\\IXU/+$?2XHPZSSAK*&8I$*]p*n; 91 | @O5Ig?U""Q2*;UXfEq4Gto>!!`@lQ_k;0b9Kjf$mKNm;#1<&!!^gP%F>b[!)&%I0+8sh$C/d70K'/$ 92 | ZB4T.(-kRu@2&\a3t1\:#S>DiEVoe:<-_mS&)aYpit2?#Koc=0S"p070eY4h%?5?1&""aoE$BHk0Fm 93 | ;!6I@>tRD,<`G=QAC&tn>\+Un\H!Y8[D9V<"'WK7p(r=35[*T7)bfp&;!BHE6?I;1lr&2b7ma=r/E> 94 | _Xs9Bt+f&k?f>3!,ta>kf=uB&e`R\$NOT9J098KK`DYd(a1FO)GI"?FXhp]=lHsnOK/[!1*Y1B!<>+^'8 96 | 6JiBF=f#""@dm@.jp-O);]jEMs&A(Ban\!!Mfr:f%[@LQksbat&"7$Pl-M\j6tEnd@./"ledG;$8bl 97 | /hc.t'VH`_%2<(b=JTIm1_;@Z!^Hbk:mVPi6k]Rp$fGk 100 | ),C'hcit__ULD>:H@ClSKZOR!(%3Vu^^m5g!!!rB5ajKRXr&:iBg;Y%UAk2n6aY62T>1Mmn:UcA;@i9p%-0nhn^daJ 102 | ne(p2&^XJiE_EgG0EFM&#iK60""Fr"#_\,:>;3Pe!"Yd.!sha/"^$.*&`@K(H(%KHJ4: 104 | f%2tTYu9>9EWh]@fR]'M'NWt[ClC\'6c24JL`T#)[)uT"!GfDcjgUPoKGW!%hr1IM$+=9qu]d`%+#" 105 | Yo-aZj4p6BfM4ai&_(1"G@_p$2PY+#@1&M/YGnAoE8t\'R:hBkb;h>Sq!8q1iYr*N*'amIC%tmUVOU 106 | )%e+AFOu%CiQ,_#Fo&SHL]b*7lMC-XQib2@:n`6/25PE;im=mh4QLF5]h&[-@]k'a_IPKJqlNnS-hghD#sc)LG7s!`:tLkr)o,_&0kE\pd55#H56ojNa$Q;ah.T\?-* 108 | d'&(@_5_#juf%h?tb%H*:$huF2n%KS7c$->"7oRI@V:Y7HYQb/bWt5BI^e2&0^rR",-crNXs]W!$H5%&:bE!fV3q;"n6W 115 | 6+d^5XG7"23'*->_:kB"`3tE\T\^VA^(=-)#1/8>$clYSYmgfidfT%1$%N'W)/^lC#S8eM!8rHsis>l*oFNdSQpCp0Z23Ef.Q"*J&7FCbLO9(%2uj7>& 119 | 3Lj3!0;oNYMHDc._lLQ0`P=<>7[st#d.eQjV@n-EAN`H2!6ih5m2'WgV=s92?R8!+HT5[n1l'/6m42nYRCPoHqb2&h66o#OSCK5+:.klMu`UJnI5V&>n[ 123 | 5:k]/fk7)q(q#$4&>J0RgKEoUSj":i5:#Rp267B$7n*9?L!)9/6R+YO7*YRo.i>-ZGud/tfd*%HKN& 124 | +J?\dVX0F"i@PZ>BY>llI6B&49'H_#n9l%hQN/&7K* 125 | QD%sT($8>'LO>/I"&G:aMFV:F*l/d[KF:]!;Qpace$t+'*L_phI-jlIE0HgW@YQP(oX:NLo=HXdpi9 126 | ^it[K8sH!$4iG/PY]M0NJ)PpS(c`rgjcGnHg 128 | ^T&2L8d4^2=ci\^5N$JN+98kR>6)GFar.%hSDeN5jR 130 | AO?es/,4Qdf4KVshdP([m4h0:MG>#'lm`C[*-Z3Ga5h`fG5K.%)9K[P"?,MR#!qZ%d!"c4Qcp=T2:N 131 | e(8%bH*rHU"1MkcW4X=92R"J(oe+2I-@#s)k]Bb/j`@*(9iEiXb0uo'1gm#>_J#)C,:kD_I'43X,?WYX. 134 | 6ml%P\?'kJ?V;YJ,hf-R"le?'1Cd'oH4_N"9]6+;Yg)m9ejQnJ:eH\$&js5go4E`J4V:&$Pfpe14T? 135 | Ik'#/Ul80@Y!L5bi5QK%.3CW\i+99;iYQGT!e.!KROQ$6?',^cm;AoY%JgUNu0][qBPHqW%%aDpT-3 136 | =^6hOg_Y&tAq1UJm,t5n9$2+%o8bWR46:YtCHYKWkH#W,%je]0lh-4YF?DD,n\>, 140 | 4R:6HD!Pe``F#dfd.W#/4pe9jR*G!6;T#4ZTs""eu'_d?t![S=8&d-MY/;IZ\SMj=)`7-_fF?l^FN9 141 | #pfab4o64QdU@ci=s1j4l4Z#uhI[9)rA(Fu^^%d**ctF@8Ir#OZfFmM@)Z!!/=/8A#-S["'kaO4.ep 142 | /PRNFR84h(#mFDB)uQ_%fr+K_VkkN$iD!+2c'odMu*V7!)*soi%3Ik&1!qf-HK`D0BJe(+U@mj4j+ldMta`;P_`*gUk9B\hSiVkqW^gJ 148 | ?0;8EcoE-)'[L*2-@Q&?M-$I@A2+G-D`O-0DX^]80mia;`fU)bJoMC/_i(dA5q4pjY:;9a)J 151 | J(l!)o=7mDnH5U.!75O>TLudthEU_^JfOiA:NZ&H<3F/8pMkIS0Z\%3d$iAWsCip8_2P7`4kg#]f>t 152 | PDRZe,(R67@91e'NI2o0d.`=rmK+E5ru?\CF-&\\QN8Kj5[ZQ"#a*\NV,;1ZA%aEn\U;!9Y[%5?5a` 153 | -\E!ug4*s$uWR>,tM9S^EV"opnbK=5FnJZ+u0JinUDku7X65nLXn!"+FB7KgL,UEGa7el^LJ3QV>=+ 154 | 632^:6[q4L\Nq2(L2b#^]5KJ(a&eZ*&@h.![P[nJKG7b-O=,W@"b3a+//ahK-Gt:#:Ud_GGbh;0t'U 155 | WTm'`B?t,,C@]R:%m4RBP'T.Jd."D:*;o?:mMc9D=a!r59Jpg`$?rSB=;03=kTUlC@gD:qO^IFr:!! 156 | H2G1T7L!b5(@L!dahKCC*]@#1KdZ/lK%J&:Xo"U$Md<\u:_U<)it*HQjYY!!Ar81C6,n+60[nknSCYJLL^MM^W%+i`IF])"9d 160 | N34uHrK7o%!aT=M:2%f#i1Cp.2?sjCYOT@??!D`1EV:9u8qG:I12ujNm^jBnfG'#u7?4u$Q6h 161 | 1\/+6t5Anpgcu(3%J-!$hRQJ;ut45c<9\5&?Ff1&q<@"1M'lTq1oD>mK`IO^rt[M:(`g*dI&eU4qJ0 162 | ii!8Sm^jTNomIDDr#1A6(]Y2`M^eWN%1":H#@`K_LsYS9n\6(X61cNQ+oX*E!"^SVGa8D9Gr#ITTFb 163 | O'<_cO!21dPT=M^)T3Ui0b4IJ=Z^]8ABh%WLIaCi@mbSL@DVg%HHG._4iLkRM_)i+6Mh#mZ5JFNUi* 164 | Us4K6As4k!/3$u]!&K1'&Bk3^'7PUVCc3*;@F$]_cA&8NeJf+Ze5]dnF!**#(qS#!5>f[$Z22BO7KFO'ZO@0b0)df$8`& 166 | Jcf!"T9Y4TT\-`./ANkVims_uoco6I6U?h)%RI5CncA!>HT,^c.(_=iG@sJ/C'E?3MA=1.4)CJ,g47 167 | PVIamI/o\l7G5b4)+YhIdGLIB7-m)=!#38J-l`XeJ-GZ\BKZIQg09(lhdf7XJ.!-Tf?]+%JRFcY-3s 168 | __3PYfe6o[8YBF,HI5LV@++>AJb`97=8Hc!-WStt#S!+CODDd&eu`oS%iaVOrM<<62Q&*X4I,TDr7GJmlcq".U5b=bl_qk#PHp?9e#Jn1 170 | fJ4'B>V%STg5c$iebSPd1jFm&"Ltl<%?r#QmMZMmf"5$a"9LFU&DFP`^6U8b\:]M<=3l2S$5R 171 | lr\&2mj&6c7!O6Yq/jc6PqH.ZcnV7"QiirT[.,2?Z:;O[MFQ@=1I'oM3q]^gP*64D'L"WWY:OdRH8< 172 | TIC4;,=[Y-J3bEq4a49%Z,-t6^[R5QmbB'2?WFO;]%d;]\#UaN'Jum6R5SOpft 173 | _,JBb`%`8W6%3_e\nF?mJ=_k8n#/A"2E(I1q_66$HPS,u)\1':o/!Q6i`YeT8o8-E#u!5.f_=kQ/=8 174 | ,uI-K2`83oIPm8$&!DB5W/cGOfB4A2aOqt^gOppOop8k$,^.4^`<&Rn72[+W5-&(K01s- 177 | Cc-j@#Cle0KApBPW%%oE$78YSO\h$/q%*ZtGf'YK_rrLZO:B,$"/K`5)\$.>!\;1uWf\Pm"/%Q)YrB 178 | M76c)4lUs*,=FA8PJC.Vl#6iA&-p_s=V'EB,(kO;"_!7/Kk*'or66C^#@<+JB*2@ZH06p2WVPX*.BH 179 | NZAk!!5B`-+lU0I2'>"_,p[=cpQ:,e&!@=#LPqj-qGA;5fRIO!lPql9GkVH0@/iXA0=4S0VFZ1Jd1d 180 | PdOZM+&Uq^?5)8JL"i`8&glS!&6tDB5`"4cKcm@>_90it)?kRoZ3'dW\7t^Fp63IZdciO8;M^*p2"? 181 | \`^A0O>c/"Z)q!p,=`3fD""3nqIaQH2G2]F8025JsjY9.7IRYX'-$$&k6B.C;=]U]NqHn\>J[.NsNa 182 | )uouG/X#a3$,d7Elmd]dGshKgl&fi$J/-!22[,9sL?)>75SHJXWl-=!%A]doJ")uCrAC`M55VrHBLdW5U"\EsP!KI<`(^>V+" 184 | MbL'`&p.JKagG#!eH<,6pNp?QnaND45_p*TPT<&-+BO">KFn*t!^NZfJCun 185 | Id<_Y-3h])NWEM\I$iGg3;Q!)c6GU)NJlj-)UjW5[r'UB07'Hm6$mNVp5D)o`NJmlA0Lu1s+pH%6^d 186 | o#j*`rc2)hPJS6k$2K&4\tg,6QjcMnS58j>Q0^Xop]p7d+*VG`@?C8->eY8*hZ+lkj?%8-9WeBa!B) 187 | (dTO.$%bIi"8k$OGXKC4T7CGh60oH=A5R(-6c9jT7F3D3P!P,qU'TC7"/%`,^9WD#,f3saKB-aGmK9 188 | SJH(%XRS5_;\HGBOY-W/eqJsKDe!"1B@)+6Fu'jt/c@!`f&5Ja1GKB+[OYYtPg?,JuFKRa)S;G%$f= 189 | T^cJma)!Q`'FKI8.Tr(!MK_60qfk[J4^TDCOhC4iB'Fn23;X(!6p!ZnJ?^RTu5f=m".b.A0n$R5f9> 190 | ;m/2924>Osi)2-+(Vr1i\I]6RC$]a-r$jJ+YO@.Hqj6i&K6bk2Q.*Va7p;p8W6"CUZ0He9(GiD&I`@ 191 | rj;4?>k_p;=DR&0O6UJ.FqV/o3XG"2HBPlk[c0EWPMf)G]d82)9_26\@p#!f.XeV=&$@6`g=r)a:ag 192 | !0-">q*[DfJ1MHBQp8Gb.BncX"?nY13&+e,9S5mL!6R=ABk>4HcReiZ8E:#pfJ_G=WF6!roZ_&.^<+ks;5`J`0TZ/OC=j6aRoMe,q9>(5`A0^eE_*=:VAo91![k5U)omci_5QDH#%j!0TMq+@gF&_$P-^JIF^E>T\ 198 | Oh+bG(n6\Z8,oK0)ZKO\?G1NhCRGTQ$5!._-uFYHLApcAQ`+i,"G8RMU+?oon?/Q#UP,PXJnYS7374 199 | +^uX"Y^[VSbiO$/oT*BS>!cP'1M,T:>e2CZEk.agfBso5hucr`"C,l!d_aZj3]:5"+=R2:^BG\AV/I 200 | %"+Vsimd1!"109De6p3=a&4@0c$cUKODdnXBi)p-r6\H9l6c;.j5TL/=*,WVo!5Lf$Zl4V!!J&fQLt 201 | ")sf-iS!VIN;%!qsS#?/Q(T4JuEr$t0c)IALc![p$.B+fh6!.ZjF"S4>J 202 | 84/(B!k/4jLVCC>cIp:pSE*L6NV!W/3"!Hs3/$WX_H[M"X?R%O#=;ZO")ofFO>+LAm87#t6ju5Fe-_ 203 | ,&*lJVHnuP5Q$j&4q6\8PJ/s.Pf'P&h)4G=JkJW(=on-I-T!Wi7Ea$i!U3n5aNBN$\.L3tHuYAd=B2 204 | Zb2H:@JmJ@o>]W4!B0:5QT&!1^"]_<X:o+6ps,Qj$+MaS3R815Q 206 | VqD$oGtkLB0*mK6T82]G;422fdgYY`'>2+DsGsB*8W,K&@i)(b3!?:J&M=7E8_&4?:2,[^b9("7S's 207 | \s37T(BY=s`:BKb"\D)Gfh\D/l4fb=_u[YRpBQbA6ju1L@Ym.,U'/Od!,1Ra$o(!Nb_5]C3jX2*4G: 208 | uo!pUafJLS=O4>;?%%)@Z26IH;Aqsq3Pec$jF@=UUd'[*'ncuOC$\#SK[N6sN^-"k_S?caA-Tl]Tu?<>Lc 211 | #r%Y^lN+\%-U?L[N"^oK'f@9pba/5U[112MEX8C-rQpJ-76BEHZ6+^a=!(5s3!l,Ghclo$SGsb/J^t9LNphL 213 | *;#XQNM-U7cWn4]`q:.4I+EWa>^>\42(c-0EUJufa@0VguW-9/e:'7SbCHiX^66lXbY!'F/4(`Yo%& 214 | -RLa5SO2ZLc[Ze9S9PqI@*dT:^D4p&YTK/1?-`8n32Yu#!r/>K+K.r"]g!f6cZDE#$=+j!(;24rr*% 215 | N%\Nh2()e\'+&N"=&`au5"#")fW7l1j09+$qW:8Sn^_I,8j>*]>Z2"X53@=pgk?I'=p`-r7.,o&$?1Pa8eAMa@:F=j)qj5!%eA)!#aVDUB!-CV/R7S0N(cjDm3+V!>0 218 | Pg:IJBe_IrpBQDOWb-^8;<'*&AH.FHMeV$/ML!!RR_1jB!f:D`NM*c8@2U'_aCp##fkrg+ABZ+&r`! 219 | 3OrN4Xf4ijtpQJ(h6T(QZg2-Cng!h_#OKMZuH'iA80>-J8f3cH-c4M"(frs1n$^"&--Sa!!$QQ1<#LI 222 | O?_(-A0;OX)#Z*K5X5=h92FJDIn#70!,.^57's/u"pAYA,E\p8*(UT^m,(>S7.aAWcqqX\-mV>X"[, 223 | f%BF]i\UVI*7*Me4^!!1S_gAiTXCr?;[7"?S](P=VWV/4=5c:X&Slp4Is_$m5&;W@Hq@))c0MDNTQP 224 | X@[R:]PMG5R!#]:.39mdNo(jBh:K)an7W/gDII!8rhUNj\%$60_Rk-'b$m66#n*S6Y,\FpbBkJPrtr 225 | N+94Mc!QQI&C4osqG"W9@!6munJ1):V/GhELG@@iVP*FOZ!'*RZJ,fmH7R-rf)^pi>%0F,/IaL=\et6Q5\# 228 | R@!`)aZ;ZOUQ'9Z[_dphDLdaE4Ee.;)Z!%IVG0\fG36o55N$l!Cr'A!3a,=k3q!<4HHQ([hH##G:ni 229 | BRB>QN.+%B]]FS'WQ9oOg3[Am*JRqcdkOt%'doZ=1_$`q3Wtg$"e\Nh"k!` 230 | q8`2.#@Yg*\!$j='.Hh?mjk^XU*1%F4.imPB`Y,![)[U1W8c[Lg&+Dga"gK0k:%W4_dJOE'!0/-DBE 231 | AT_$9j\/GoOW=1kNLe:I1*p%Ej]bN\CqPR`#"kK=INWOpX6Aj9$R!]WVqP%M$Qnoc3"fI'/6T5JfIK 232 | +6,&5L3:^0K?+$!9]S$mTVMPfqk>gD]F[gJJa 233 | "GB_i12^ib`9FAGXs!#fL/'beq"%Y[dD1I:*86,N7;iUIk#6]dS4E*>n'5s,._PUd)aY^&XY"Wr@25 234 | Qq-uXl0lm!RgaXQ@e`n#/I&FJ;!!60PV==!A"NA\:TKd!%]C(0-"NopUF)/=te]g*>@S"L%=`U5R51>_%maa"F.Y_Ic1<(dHe!<>rpQ(K`94NRS-!!2G, 237 | LgW8@+s_1l"2nQ&&9b/&THXbQS7Oo/>VkUf"Wnjp'"A9,84/3(-3+IWM8B0G9$o=EWBd0aZ3i`%(s? 238 | B^*F43;@R&<9!#qae*KT_SA_>Zd+nMdi[rDgI.=j/[J=X[!mnU-!;e`kntZ'+qqa=( 239 | r_U/-0@`I&*24]#hVjFKD^%ST\j5g:iHC8&A?5lnfn7A+WUO`oFf870o8c3(?C#M2qDdYKLi8WiAN7,T]$t;gi87JfKhgu!# 241 | /-5,nG_U"iNs%!rrHoL2&&"^UIk5t(i9f#>ZhK/]K1hN&g]o(C(KjG&)`8f" 244 | !nKj#DD"Dm_E\cjCl`-,!\*+/fDg)+=Ro-2YtN(Bat9MG(O+qV=Q%20&`8/PJ@kB7'qIj6g,n]^^^R 245 | a5s,0.N7j-9!!Mkg)os>]0A"&t+2A'.,uJ6Y'#H[=aT2;EJ>?NgdJ>bT-u&pb^n(S2Q6A_hV)DiQ"[ 246 | tRL6UKu<9*DILKH\24K@oQ$WN0#F!!W\F=EY88W+OSc>WY=b49hL`GAL05$D&\!-Y!a#"jdZ\#]+2c 247 | jFuJN6<$-8&/iC_PDk\+qn-;:YmgCP=bL4+U^-\k%nKfo.kh`W&Q-9P=TG"E+hPCrORE6;F>4bs_C, 248 | Y26mn``(P#D0,K#U3PFKX)K4"sGGtC.Af.WSh!V.s7#gF3]^n-&fji'0_&pE"tBFcKnU3QI6[hEZl1!8p3 252 | Z5PCQm?r4g\CD%n/f&a3ZN?5!$O&@Bn'!T%L-D5@T)da.$,lduK!*ojAX"Wuo-db=Q;&Ttl_ 254 | Zoia!&.(R(;:@,ncVEj:flO"b;46(Ah,tpBP(4!O=[U_!hAd)MHaX!3h=ki%"lM"qokj%R@N1Y]L',:hYF%!: 256 | W&RJ8tmfOpn#8%gIJ!TgOEPPtAj3'&^+pU$IAeTe6Bs+?&,'Q?p"ET?PgNS%:I*^ 262 | Ye1E9YS"+r!C3h)cs_CF,=nKf6VnMcYqHQjGsCd&#P1b>;+)HK0Fn`)"Sd0@^f_&Daq>9QO's1;TE# 263 | #oWg&&a$'5/h#]1."L&_e=&YR$DOXlp:"-h2X%,dW[2Hc,LBF3&@&5XbgdtefZg^3I^0-[8-Yri)q& 264 | 0?Au#,?N_K4PB4C53I*!Dj]*!?2P7#S98V!>%P__&s98bmDaW#_8$G;f5[q4=U&1%cHR]5i)qM^'ZQ 265 | X#iLFAn72_7=9Qu;"(3?*^^koLGRo=mK`T9q5V<8$QF!e^7YnF-GIUDKT8'>V0qJA_^BiYesU#4SQ#d3(0k49:lJ&C@Y0 267 | O\>lH?NNJ2%rh:O:ffS@Co.f#"%*j!"2PM056M`T&dCc-fH^WD6XIU2'(G>rYY+uc!qp\/1gg!e:IXTTfk(i=Bng%%s*oi",lrB8DEqM\,+l!)mJ!GmnEAIWCbh5pR8Nr 269 | X4f\/O0==0THuikRQQ=9X/u8!@p@,.AXM@(I6jhKl[mRoF%=N"m=;j0KKERXD& 272 | GuUk)f+P=e-9B0gJ5]Eu.h,=:"Rlj75R7NIPD)of'M,29Y`U>q'*qG)VZbFkf]"V9PX$h0;a&1nS](^(t 275 | +$J-jG5kKFK>S=Eu!!#llYqH@@>)4nZ#U$&YnG]9$c4=kl!'kY#T_&=_J.f)?!96KUYQ4o^:B=94$8 276 | D@6!Qg[;N!k_P9b7:)YVcZA^,GJD:D#\in3mJq42.@5X5P]BTJ;IBLPla"!P:l@T\i#'On/6*(+V?O8ER#QRR!O9$mL/ 279 | d#NG";%3?Yk\TKL]L?!(I4.'$ho9]ghU@D,,(/65bTVlgBL#e!"_X.4),DXq#Hn=ZYDum'"0(d&HlK 280 | Z$+mh_i84pXG6>'%"X&sDp*pV'acI)r['=lbUOA.X.gu8W!]JIb5fWoP&.67!#T98_4*e9RYbOr$bNr]4u"YbuG]<`;mlN`3n!K[Tf?t9;H:)WRbXpUObf5&7gRCmMc29bZut8:u+2AK,<=&4bs4Ki+6pH1($X!&d0bE/.B)J%1U+QbJ>hW&0EEA0[MQ 285 | <$EO.-Yc\Mpnd;&%%ri2dD,@1N?e4E(W8L,gZe/du\@'AuUl^t9.dmga(P(/9+9r#`,nf.K1]TgD+X%0]!PC-+"`iGUEI;%WTaCe)gE!">a>qiQkRIX 290 | 8L0U5Qpe_#69ae@=#)f/rSCnJ#q?dcp@UUDi0OOmR#mKq@M$J$@l+X#jc?B-j/C5#U 291 | $[:U!OB*W!-mm!AKG3kX'(#JNneP6t,9hL:.I'^(m;B#f+n!@$:ale-"PGC2hT(&-0YR/IQ0H!AKAF 292 | Yo4$9:B3'N$aE2\frc-Qp.%@JbX!cgo0M"*+8[YZt.ZkHP`os!8nl/0e3c7rWNIq$uda":k8uSdLJOu%FEZ7&@;bjK 294 | *IE$!<=ql5e.Q4"9[%5!l0!eJ?]@_#D*Ne#Z3tli#m_U3P_oa*.UZg^fUq=57V(7.rZiEL8NV^/e=% 295 | g!&+N\%7(U<`WMf=^d=AgL2]Ahua/N58!tZ'h,MAd)cB=mO5mG%fks" 297 | +Zoj;`X`WJ)5%F?1;adPK)ug]IYr4cTih@[;\B)S5`eUTLDgZ`Acb(I(NOp.>:7OtHAGM]'!X=s^K_ 298 | AYQN6$"%BrCdUf7P+2Y#/g#JDU0+;JF:*ZgM*#pLlM[7sN&km3A6'LskBkNNeE^Ar4p(I6"@J-F7Ad 299 | ]/2r!";7#@YP>BC+Cu$$<'S.abg6%QiN69=aIIsOT#tf@M5o_'=*\J0_(^<#tU2&$r@!*nE4#%kSKn 300 | U2!c4ln-]4:#9n2F=^W-,#O0?C,[,k 302 | 70!Yhlm.eq5!mqV19Zq%17kYU4!O'p&-da!'tLhqqrLqK)i@&FE)gAnZ@s@hW@$gr 305 | BYGA+prXUKL@A)97NmM5ZPi`='f[RC-O8sTVWBt#M6cou>=Ub?3KU_q(6UN."aT)>4)R'2H,E'>;)9 306 | L'\X@2"5-NmC&-mfQ2+p=JiN;&;O&:c%F2B2\tI0^[?!7@<7`K1(A6O-*&=s"!3l;tP(3Ng5=rd.QU/sW\1iXB&3-RPc_)jV%h/ 308 | L=G^Yt4J,ha[Zh+n2$/"V_57Va*Zm>rS<&Y#s,m7:>$r?q(;Sk*fX[3KH]VSO2huI7S!MBJG<_>q@) 309 | EF8Xr7V3]g0m>ZVV6#m&3ps_F<3T+d*guC!<=gt`'6Pm[7`JE0HmDnVB>jT2?8jg8NdB 310 | AYQ,(=!ON"W:l9Ze!=l=6L/;6rI-4=$A8kTM"cAuo4q4h,e[@^EnObaU!!r!Z7R-qkOd)Qr9d`Wa,g 311 | HAjomEd8;8`62VJkr(_maSAE*rYP"_`B_7D'8(Wf\Oa?+L0D\01j,J,m2ZaA<#M!NY 313 | fPac$<%>I7+U$6t'%j]OdSoaCmY2Ak`j6Ug;Xdm;f99G>$<#&<-pPpIW"')#0[?j7$CM2.3` 316 | IfO-nCpO.-OaWV$7AuVnc*R;ZnKK&Oe6:VpZDJ!!$(W,[bp,EH!uF3)1`or-!Xq!#S6&!uhDk8cT#Q 317 | 7b3_QGGaj>+>SPCTCSm%TL]*s;OYFZ(]tVZT]J<<'Fd;/oH?KDfoj28&AS9c+TUXE&g4%O!FWDK@'N 318 | d`!'1ud.T.HUFJ/[W_E8(e,X\DU>6"X=7p\6WL1G6S!!Zt3N%09"Jln[s&J"ub;!8RD6!Sp?&1U3IL 319 | _F;=<6%kW\fYWh&3p5s&Y\n&5QMCK9lsW0,rl)rO\QsVXJ(BJ)K6k!#TTK;)N_`[+%]kmLgcNs&;Gc 320 | [8J8uD@oPl%&K!$$q&GMC"BH(W\--2:;[tH'Nf1<(;hs:,'((2iJ-!Mbj'1+YK!m+m&5X$-+D(qq\N 321 | CQ;(^0m>)d34ACQNQ,!Pe^=J#.Q)0Z#Yp5qp$89lr$[A9KJR!%fYHE1qiLm5mu]QltY`X:VT9-A^mK 322 | %fdRN#`"3mU_t@n"2Laha!a6o_bXKjAAq+A3?J:t:(=;hYQ8ji;T9OR!Rd'aO'sSYatOqIK*6W5[.# 323 | 2IkkuY/.1er]SA^&b)[OVUc-E0b#j8cS+0-.2'X2[V"r0Cq!!&@TZ-aRdfEs#Or-Lk0]!aC$+j`,oM10E;uJ?$n%ed"Dnl&.L#9f/O2 331 | aVEL4PEf[Ko\M%,`BI@_up^V\'j_J-8Am!$Y<4&B#ujgk:Yd]$s>KYtl#=NfDBg"q"K0$)+RpJ0DEu 332 | NR/WE+92Cn;!K\%@D<-,!*PQ&bY.H1:*W.d3*!!#8Mdj[S7jM95'oYJH:S 335 | B$Du]mr*Ou9!ZhXZAgh&&%Wrt\N5tok!LLTK@[JE>7?@N1jD7HkiBg@,\L\Dlk[rt-&!dCY>mIrgN= 336 | V-=:]ct#,;m]K&g@/j_&28Fi#Yu3_Unhg:h:_9p<]2-pg[7`S10)TdWE?m!Q>'GJfqkS-bon\MJaI8 337 | "'C6Ki(-32c;,T-iBUY[T@Z]V\cKSH.8,7H4+5LC&Dl3>Fn,GF!!#Z,6.DSK17KDI;&g5l^al8.!%\ 338 | E>oqSnRYS8D+63jHY3M9VP?4'4M1pC`@,]IaR&6G\13%5l#E!2>5,X2SX/Hp[K?P%@Va9FIcJ3X*%B 339 | N%6R:fI9iJrr"I`'On]!$C\rcHth[2,Jf''1=*+T'9/ 340 | VnA[:@9]Q?YL#>Nr/sW)+J40iR]L\Y/3$.9.KHLnk;=d41H.d.+Js6E=N!N,<#pAS(#`Jk?>T/hd5J 341 | u8%+L"\XQm./jnH6-J!JNDH!!Eq]9nAN/$5qegF:,pU4oj@E@+7LF`,NQb)#t3gKB:jmA#6:5$(aL3 343 | 7"n6j/A&W="@RC#9_YUBaH;$V7p"L7JarLs9/UO_\2NZk4;0s"(X7nN1M5YrR+]F:K!6Nc:)_?`H]& 344 | 5YX156>i$J34I`":i44:k1e>!6bk%FGdk-*E1T`!hdo4PX`R[(]^p)KBNr`*,WW-1B8NtK((K[`"<) 345 | &:gZI=Tu]r\490mE!K#CZDW'VMt!!qX]Mel=Z\8Mb4/k 346 | -76K!n%^O;>[")$'Um+cK5kSk7l5^I1X2!,uMrhA'5<;ZR.(,#*>!E-B%X3Q,I[!',B:/5V?Mj2((D 347 | N7 348 | HsfF*B="+grn`&'?I9h7U$$@kj@6i8:c/k?*j58<;c")L\a&=5pe63Flq"OocTg1&]b;a\6n"WD$Le 349 | k-#A(t'C$!C/2<\76kI7j@:a_nd&'"@%bDcpf!Qh8fq/EDAq*!m_i_5ZB*Xn3R6LE6XV5g%8+V(`X4 350 | A(6Pjm_mD,7YUY7'0bWD-_3!BhZ5OrY7mhq:^rfNje,VgC9-5,[7(`PN$jAm5:lK'h_mO8jpdg%qgk 351 | 3RE+QODll0h!,.*a]U_,Z=\5bOn-!"sZH"2npS@,-EW.uA?[gu(lTA4"1Y!WdrT^]_%K0G=`"n><^7 352 | ")ok?<3\aM4.ahNk^\^>gdHcd2o:e]9lQao-o+EUW'mjBK`ie*oM@di9>I3,Ao)pS?oN[f3*9!RJ=8 353 | dB*a_>>%$'UZ7'U+825ru728G.`K@E,:l6-;_4+Q-F(bAKK^t\nn^4gubM2$!Q1d?RS"9G#TQ*=*3P 354 | YaUn#XF9<(6%1i*)m!<3rjd2!@j@&*':"h!fZJ8KBO8n!"sq3m"GEf`%jHl-kH@ZoE?sB`pa%:H"F6Dm40C]k`FJ>I$JfkWiR/;.sua:4PMe.k:J!!NKLK7kG!4:D<(MZH9#6M(pV":.;)#X 356 | D?U6gOhDfDks=7b&Bb"DsRB\Gh.p/jMrE&s+#GFAdb`2U[[=.KG@A"<)#o^!JCKQH?oFh]Sc]u@ 357 | `<\H?^_U?l:d>9o!PC1Lkj:YO-ABr8_ko5B[8DGW(Y?Gh_]@&tm_gfD!VADSPgHE=7ha.["U, 358 | HPP[dVl!$sU%5n_3@8u]`+3[1@R`683HN^EqW.gQP"AaDsJi)#m[5JoHU!)sZL0fK1WSf[(r!!ZHB$ 359 | D,053(ooQArK1hi!(5V7KS5C^ldKlBI&*F+G9GRJ]IgtJ6#%I^P*(#-8k2tVuVBR0;#10"#LeHTErD 360 | >;#gpP6b"\iHj3`$;pS1ua@&>2$3UJ[5"J@96's=X(c_Yf&]FkS6?#9-=FH<"63D00!3D97fV9ag;[ 361 | h&D71]Qt*lu<6564^`!9IC=m\qg\WbAV+&WfgVGWc-G-NG+h6@Qn,*&4MhLJJI7gb_EOoJ"e51Wnfd 362 | +V[/Y#TJn:1IK6PJ.)qgl8Obtbln@r`$(?o-P.$Ym=D"5k$s*VI>2(;L+U"_\ 363 | \VkQg!E!'u4mKhOHl5]2*+&HRP)J^>4Kp]Z?_%`=tOh.T*lX="$G;ZJ:TC[qME-kPfc6NYZDLZf#iU 364 | 1si7'C@e$gFP$H/3X'T!N?2d==aV*P0ASeg].A@KbF6"Qr?B58H>hP8*!O9]*e`ga[?"F`)Jq=+>HR 365 | N$UR,)_rNt?bV?s=P^aPY&YS[IJ;5X+6nSh,:EkrMM 367 | JC$Hs_7Td_1r4'VKai-W1fOGT%bRul/-%oP]I^nu8V?q*6JrS&UelSp)\D'sK?5:r!0lo%,6T,CKa8 368 | HI,RON\UP*;A?K_V2e55)8%7b#c5g2:+[Ksh`#dOC;0\tKHpd.?`*a\mN5YqR!$jtI2:dFM!l3oWPT 369 | F$3D7Dm2$64$fr&Ntu,"+u3M!"/m^.(]HbScB$6RJt8-!!Po-gjnTQc1V+T+!Q@$*bpK2!%08sEjSa 370 | o/d&0bJ@\Upr!*4Q;?dS$"[FcWYWp%p,6r%>05O_-oJ49s+@4'dJc$kt#W8IN&IB<)"UkVkA5HZnTn 371 | G//U*r=Fe,Tlh4BE'qX&M=$j>@"c.Y=HLDE'u,@(V(?5=WX@"<=3Fh%kV%P>pI0R]le0&>(C!0Cp40 372 | C\S=UEa^Q42)U!qY+S1G$6t3X4bBY>;6U^"^a\<<-pbTu!&t^u,XK=U9?Sof"U:bj0f'G[^;M@)"V$ 373 | Cknjnf"l\$B3^aO4k0Iqa6-G_QZ/)1VdAjD"H%`!2?___W"E';+g*e4Y3mp&muHK-^O63DlWaK,n/> 374 | ]<$k28O6(g)t;6$l$S`LHkpm">G,:6pfJTLID\`KIAn_^`3Es/-<13_cl:lr%Ea)*Q03e&JuC\Z;dN 375 | Z!!0t#"U$(?Xl$6s5KD:n0On8hE'>lo%RLV(5[ssd"i9r9l,PbR%J0WEX?qPF#sjq5m@m^7n1'$o1Y 376 | m"6LR\k(`#aU=$,drI.QA@I*"]utWDk]Np'hUsI(@#m[0!^3018-ZqHaX[0>jL]K2adFQpsH)#/G1% 377 | ^eWm@j9U8b5t:t(^]5teM1EJr:^%+;2B6,Bns9=Z+,4_iF*LPI*#ae7\hrV;Y(-n5/2&pn61Dr]AaD 378 | N\-rGLC#/IN(5m[]\=@.W22g=aW_W>Zeqb8L'rIU-(!#o=u6r75tI>!DI5[ShgI#ig)#lr0WJ8Tg)&-;HrQ,-Q-_/@Fa*MNeo13t2G!/*,_i&sFE-@oSN^oGdTlGNH(7g#Lh 382 | ;diQ+i))akm-KcBeE?oN*'qZ):pHs"K648+%InrK)aqD3K"u94d7HEY#Xf`,4!6c4^o^!'C)]u96[/ 383 | ^/,UA"))*lg[]8TSe&-TeY%)AeIH[JhPX;SfE".,[$l$sq-3"CI\7"VS*9;!(?aAYF1K`L"i.2GG%NZ7U";B 385 | qN'$f(K42\`&0UQC5D9eBGM^IMP>D;bkQ:Ps6NWl;4oe 388 | %SD&,M>!!!rn?gq_)Z3:RW!!D[<4@18*M8^[DBY7e1((ild;5Q?6E>'[L"t0aT!WKYq\`4#3<)nt\> 389 | /V?;"M+.)5C^0d5Qk%,psb.h-e!8r$-`ZeJ,p0O1[#6DLb8Z3,Zk):(k4]>X]>f!Lmt#;!"$0cU*sL 390 | O"rCYJKCUYn:^5lD6^-BTs(i-0!CbL)&cs!rf[Jh"6225r"[E3(Z[`/Y?:7=raF\pB-A\&i!9b)Nob 391 | i10J./A:F9$94^)lT+*;MZ056)'0/\^7d\r@ch6,[j0+LNXoJ8M!a!@,5QeA6PLt*hd%K 393 | e(!!GeL(J2CE(h!CNUh'-@g/J>(.1ap=r$9tbr8^8*,N/hY;rRZd-pRc%)&Ns+OF]WY&<)<2%:fb36 394 | -IhM>Q=hm;%PR7!$3[WK^\tt6-Wh47KEk)'W=P@7.\c.GPV&`;ikG*<.\-!(!@WVSk&+Gf;BSRl.,rgtT/70JGoK]AVJ,t2m"[V1R)EGj"0a\91fSpV!__j92ZOp(=4tN>1 397 | ]DrrU&-44dO&-GgI_cQsej%ILF9!0F[]Wm^*HXP7!!oq/jr4;>!!**c!%9E!$e.j3:[>Y("DEQ.H,V`D;3E*lTab,LmA#Y+95*N&1V@T(QgMer>JNWPQQr#O95p(6R1\)#SAsQS)-$ZrpE5f 400 | 9Pf#KnQ>5IZV$@M":]N$^K@aa*"TSO26m[ufH&'"A\#MISmFj<*p?W9Pa\S&7UZH 402 | 5K?"hS3P4_!E3Ma^l"%lcA,EU?0OsV,5"2c2"Pg>h.,QaPT&JON\!!E?53J5bo1Lp@ 405 | ILZ,ZC!Ep][Moa\2&=sjnM'FEGq8C'Xq2GXc2?Q8psK?AH\e1?8."_DB3 410 | aQ?lCP,JK!8&Ze9Li05E19E>,.$:M]crZK(VJHk*\2o#Fe,*IVS4d%3l+LkAni.)*L.VqP,qS_)W#u1k!LeVB`?\=Mhj%'"Q-Y,Jg940J[a7pg-";lV.K^_ 413 | DH(rIK6(10,>C&j'hSZB\2E0)1X2om]7ZIZ[H$QqVti>CJpTL]riYVK(6][p\86idOTqBAI,$"a;=C 414 | 4i5h;.Lha)\(kbbn'nXa8!:I!&B7jRj:I7#[@Vq#RUn?:(rF=70@2,Iu6bTGAtYB"Q]=Y*teu?K?,r 415 | +69>W(#=;aP@[7OuPqrDZoK\9SJ7D4`K+Bcn"tDnD!5gpT$J])Zc4;,.7V&49QoHu&s=i')@qZV]DrMRG%=/L>nd!_Nck5Z8:^F7",teCb;_pcgn# 418 | U>gDZ1t2\uae[S!rTM@[qn5Jsu2'tQa!7%uXZ#P]o:7d+[n5X6Oq=[iP2aDVBi1*t^X!!b"+K-9.V) 419 | d2T7$tL?tN$C_.JEF9Q/jt=<5j2O)h30%Ve:e#%E^/J)1EIjmOUu_N]s[9,%`K8VDl*om/T"[K18*LHH5gULu]CtE0;gs61G[0Y:tM/EqQ`EDNH:L\Aa-KrWiNC8/ 421 | ;T+ifi:I,kDHA!"EpNJMgCk`n:EjV)J$&54)0\R'a08#'lISe 428 | Jq5f.'Y![t!@L0u&0,K14eeHBhK?nh]lOZj!a]a05d!!(M65ktj+!"0>gGXPOsn-+A%p(,c?Jro.,+ 429 | >cFD7LhfZL1lp1Lm``8cWt,[M5[&("L*VipMo.!#*9?"&@uqf7KANg&0RVU?kN[L<=Gg1!!)7Xci=D 430 | cm17"jFI0lHYsn_$m>JIF'@6kY.%uK:g&aOC6*U@qi"AZWQn7f.%)>:8OPWRV$4ak5!!$;V:jms>=a 431 | siP$fXs32:`;4mXJXA06eub+<(\*NW9(G%hT80W;2LQ.guF['j1?p#\@SP\i?rK)fYdV+F=\S/.:DA 432 | '-RDX()7EPK1M[NKn'.-iqSDh2%cUoO>\Er?jm;@/e@F`(pbP9nF6Y^#Qc],"aFP\_"@cF7KEau&+I 433 | ahBerfkBOgR_&V0]s!!!$Y@M+\)#B@9a!.f#b&Ieg\/LS;:np3sl=d9%nE"TW6'H%j0D?+Y;&KpcI8 434 | N&ZG(M/,a&R_aB#u;-UrX,=$0&S&d6/,ns(bXg:CXC'$E$7MLu#$H9'@k!,4qLf!>CF&!`]kj"7H;aPn$WP!O1_qO[]BP8._HI 437 | $KBhlnB;DuoFJ12"/h#I]FS9ak$E6So4/d.79@lXm'!!!NenBd6G<=OfoITa?a-'\fsV0juk4`C]4QF!5$.02,6/*E?Vai=E)D[kCl'B!R67 439 | )OGGrr\?H!tYeMF:WjT_%,CJ!N&)1:lc+%*!J&c$j_rE;F-.^es%'tV!+H[-'e_-"q2@CV#"/$fOYN 440 | ][f?JEJtTsgTKk;0b_+jUI)$'j,c4.D<=P4OIj$_/&4cikp'Je,RYTUVoUMb5onhW9T5Y%.AQO 444 | >6e@.BhG+Wotq/@e,7]gS&$_!u0:G_+"n7o7n`,?5Z$5&-`UZTmSdc(r1h-@*]&#"b'8jO%B$<.2%6.`/]1^WYfM-7m102iI,Qu<;!M&LU9[Ed,uDhs^cXDnnX 446 | ]PPO;eFVPc9@E\6Wc-YfFYDOJoNFhZ-ji1JpgJ,?Y$ick?CeXT8EmWV]^tWN`"6c42p[a\O 451 | BR@MdT`md-rE@U]HRF#-%]ZOTLI1!X6qb;G^[(E:=3"/-oj+W7Soq@-"L:P7OCF'B&a<0O8orC^WN% 452 | U_*,Z6E%012lBTh^me@8i6VI:eP[95`H\)l\+R\t#mB`I&#OJud(k%Lm1(=`-!X1V+_qL2+qrnc]N; 453 | u]\73Fn!c+I*[F/%q\F0tOO9'mF(-A;q99l-#9FrJl&>7/Thuj4+kPtV\#O!/CLZJlY&&;*`!@E@2i 454 | 2$mU#9,ru"7Qm5CHF=Kkm5(,KeP:_nh,Q6h8NUL`VTNAnFZk3bWi_]bBTGp(\CGK#QQ?2$5smQ;#%, 455 | i_[ZCUKg5WoYQ+_B1QV&-%q*ts@T;1?HN5(F@ScB&)%CUfjYS7I!M( 456 | F0%.DWh3i;,l=rsK4u?Q`kfbd%d)\HV6k&0M/i8jG1/M@ZA4&0M,Z0\X+J/I8$I07*$2WmOl+I1W.O 457 | %<2?pR$Z#5o?X,&"gJOZB>^s?jUQ'"=$Zn[e%?6bfFR>/Ib8oI8+D$NAjM)MNMhF5co2Hs9%"QM%_? 458 | t9n:UoK;/i`H#@Q-h@"8?P!Y4^s!:WA`g34+$^((aS'B"*9J9?SH[gaG_;_p9LOKZ\*7Lp&u"j0O^l 459 | DB21l6@^`_];1G0Ym_rILmV3!^Q4//U2nr,C`C<+dDSN;!Y`\@h[it$f',=0EnO*jUFU21Jh3SE7h# 460 | G4qHT)7ACdo.i>d 461 | (OY7h#M5i1:H]Xq7>^`AfFU;#(0s=@,^)g.DBmZrRlK2uj:_h0:R)8+VH8DZGmU(h_s'kNrblc4DDu 462 | N0"#AJ.<*$D@dr@!o/BV7G$)1E/d.dT&'bDK^e0pO:phpFGAd*-g!+>d1i$g]PO=(Ds&&R[S3nHM-7W"qXJ0>H[.M*`#!BAPGioG^Po*-E8@Ek)'M>'/]]bB<<".8 468 | 6=(b4TdU)rJ;&+Jp+YgRbNZ4V%6&J4[ejaRh`%ff*7!k,TN?&J=sK0a8,,>rkMU#ZT[n&jH@3*t_>)!",/:YS]>3&e2^1K:]Yg,SgJ:r&R-ItIm$]V%K 471 | nKR*OUuVaX@^?CZrR[mQnPn@lY,:JL#4P%Un,\U$4GN'.$EE)hM3mq_7bO@QEY6!>-"Zcl&.QKK9S$ 472 | Hn`\Qn,us8$7^ps1JeFffB!MAZ2b&2!GfOP1%(mukC4Va%);nmaM7n.s5L"i!j.Y4;@^dnl%B$6+d4,fL.)?l&7C$nta5j%G%kt? 474 | $cPOg"JZtN2ibP,;fMk3Y$UMrb(fsl>.73Hk7KJ$u>qj:^R'[2%L9!(4[NH2!=pj"GDfN%!WVL'+fh 475 | j+6;r;7Nc+>-_J0Zg1UJ1Mo%m_#-;i6.$VlNEli./?Nb9nb9KG`!3?3Q&t[6:8IR6>8&jjNA2$)$J&M,)U!AlQ(^sN\ 480 | nJI7J=?u/`&+@Q8<`U5C<(@seg(kNs1p'2/9&1\%rd^]Z&^ggK36:'ZD%inBM!!GRH!sel56%lTG)8 481 | H;j*"^&1UfMnDo#Tnp`IpK:6R*J;B:4`u!&$qF!D)u4-AflY?XFK*V_=D]TE#5LdF;cG%;6$RA4+]D 482 | L2C!'!MaL@@$LSQ%*$eS!!INBQ_kk`5RKOa5QGe3LbJfq?q7F$$THd,KP_=I;uTc6>D'^"!".<,r

Fh&@i!?nlq5QXZi4+L]=`aFiu$Bi+ 485 | Xgj+m`6Y=[tGk(^"[^A@,eaQ%1Fq06K=>HnLD2pV1V.\Kn./.Ebp^"0C"ZW%J4548d!rreCT1aP80I 486 | E>C!!#41@%oBdJLFnAc*]R),C-h3^l!9A3l$9F\0olU*J+\b!aeXV/MY`T)]M++!$-8(l$pir\%UoO 487 | f\P=3@*TCE[i0bsK$7_#J1L[Q>!^QT\Qa0Rm-^]5$.hYH]r8k.1^!!0\F^WEt:`7R?#"uPFlN4'74D%8JBRr&<]*C=BK#uh!!F,ehT%kg<[7NSJ,fk(b\1QcV?fAn-H 491 | 9]70E?(Sk]RmWLi%`1,W;A_5!i`Z5(IqdL/D'gMi[qN%BF\.&RB+eA)=CjiK5L\3MN+mdVp8DZlR/V 492 | @@5I5"TSO_4fNB.]gHHbNFZC1J`m+P62lX*d@V:I"E#%gn92\-U`BRIV&n!r_@maGAh]h(oW8fNOWOm#7NUc>#iQ)PBM4#p-P.K1NQR-=%+Kih#u&Bp?k*Ntr#5V:# 494 | &,DLH8%ngP*jX-!$&iC(LR4G%^Ts]^_#FW;h_t8`);emGl+f 496 | #l]!"%%o!]\7>hP#u*-\8e%B?j%\V8r:RRumOJ!V*N;Zm]:NUppg^Oc^_.>Q>'T"P,h#68laO!"Y2< 497 | #q@*X5f.Q2/90#<_C9tfE0Sc]+KFKV#CYQ5#rK()5 500 | i#0kZ0UqOM^On0[q2ZO>dV_s]M8\ScS/Z_^!8pGU 502 | WSdbHRrM3SO(_l#!=Zb,VHe!D8Z*@nq:>Y7nn5rj!!)Mh(EXA\GmF.b!8,ZP+$d,>iTM,l"oVh[PB% 503 | kIiIDYTE\n_+7O1ZBHNRm0I2i95PSl1@:PS)&Z#&!!LEP*ro?5(bj/6!r98 505 | 3TE$h5VE34K)7^eR,QhMXJnZbZDOO+TQA'hr1^9p1('[snQ1/W6(l@Dt^p,X-nbbnpAVC4/n,Qb2=9 506 | 9BPS@dOcQALaZ\]>sIguPge/jVTf5`If;A%7=('\5q^4jG1#)Vd[M=96=,iZq!3Js)do!!T%qh>CBg 507 | NF2a?M1?$@j6F\TIR:H'CWlbm9\T^.!6e06^8%U<-3.K*5(M0S2cEf]%atD:##7cHj"LJu9pBN#n13 508 | !7pjZ[e?rE7T2WHbE(t.`N:NA[gL=dm 510 | ,T*hj:"_9P:]E8.h:[";-!A17\m1SoO!!^rJ,q=]p[aNkLj.P`=@B-RFn]WP%)/g/g\9`0KOuWX^3$ 511 | BTD'Lb>p+p(gl+p"W'*nS55_q@+fJirZ)GM>Y_n64Ae0pmtrLoAl@@3!@p(p-,.7%nY_f?XR^d,eZ4J(V8_rq9 515 | A`'+T5*(\!R_g-3nfE_M`)MP[(6"g6"Q6.;#,2t:E+qRC5#R$[G,@B(/iRCrE(b:5&*o^"&M)$GIW# 516 | >bc)rcGu@[\Z0A347l.`;`,@^'(rIOi@8%$OjGU=q3Yi\"^)rLs?Giqb=g!\e*k0Z:[Y@hLNV+u3XX 517 | 1?$5-UG=Xc68W1E1rZmZUJ`u0@Q%_21'HY=gho%1JiI7t38ubP"69FshDlg\3odM-=*P0B"9~> 518 | %%EndData 519 | end restore showpage 520 | %%Trailer 521 | %%EOF 522 | -------------------------------------------------------------------------------- /third_way.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/arnoldrobbins/texiwebjr/889da9a8a28d68f304af19ac788d1b0eee479104/third_way.png --------------------------------------------------------------------------------