Н⌡m┤Ёй■Уd DFЗЗ 6"AАC^|ЕbД∙╢GВ3о■I\GLH\AldurFileOpx\Develop.txt\GLH\AldurFileOpx\AldurFileOpx.hlp!:\AldurSoft\AldurFileOpx.hlp\GLH\AldurFileOpx\AldurFileOpx!:\AldurSoft\AldurFileOpx\GLH\AldurFileOpx\AldurFile.oxh!:\system\Opl\AldurFile.oxh\epoc32\Release\WINS\Deb\Z\System\Opx\AldurFile.opx!:\system\opx\AldurFile.opxAldurFile OPX ╘G.L.HoldenAldurFile OPX ╘ Graham Holden, 2003-4 Please see the help-file \AldurSoft\AldurFileOpx.hlp for licence information and help about using this OPX. An example OPL program, AldurFileOpx, is also available in this directory to demonstrate some of AldurFile's uses. Pm├Ч║U ╧Ьч≥∙ @ @√l[@iTable1ColA1 xColB1ColA2ColB2ColA3 xColB3ColA4 xColB4  @├"DATA.APP@7!@.`┴a1b7cQD╘ 2003-4 Graham L. HoldenAldurFile is an OPX that provides extra file and directory handling functions for OPL programmers. Features include:Allows the Archive attribute (whether a file has been modified since the last backup) to be examined or changed;Allows you to test whether a given filename is a directory or not;Provides an alternative to the DIR$() function that allows the programmer to:step through more than one directory listing at a time (for example, to traverse recursively down the directory tree),filter the visible files by their attributes (modified, read-only, system, hidden, directory-or-not),filter visible files by one or more UIDs (EPOC's Unique IDentifiers that say what type a file is),sort the list of files by name, extension, modification time etc.,access the entries in a directory as though they were held in an array,quickly access a file's properties (size, attributes, UIDs).Provides convenient file-and-path parsing routines, without having to use PARSE$().Provides string formatting functions for a file's attributes, size and date/time of modification.╞B dх" dх"'h≤ЧЪЪ dh З∙х"'п≤ЧЪЪ dп З-х" dvq'h≤ЧЪЪ dh З∙CN'h≤ЧЪЪ dh З∙wfcCH=T'h≤ЧЪЪ dh З∙b х"х"_х"х"х")х"Jх"х"х"йKAldurFile is delivered as two pairs of EPOC Installation (.SIS) files.The first file of each pair is intended for OPL developers' use while writing applications that will make use of AldurFile.Opx. The second file of each pair is designed for redistribution to developers' end-users as part of the application's installation process.Both of these two installation files come in two flavours. One flavour is intended for development or deployment on real EPOC devices (e.g. 5mx or Revo); the other flavour is targeted for the PC-based EPOC Emulator but is otherwise identical.DevelopmentInstall either or both of AldurFileDEV.SIS (on a Psion) and AldurFileDEV-WINS.SIS (on the Emulator) depending on where you intend doing your development work.The following files will be installed on the chosen installation drive of your system:\System\Opl\AldurFile.oxh\System\Opx\AldurFile.opx\AldurSoft\AldurFileOpx.hlp\AldurSoft\AldurFileOpxThe file AldurFile.oxh provides the interface to the functions implemented in AldurFile.opx. The file AldurFile.hlp describes how to use the OPX, and AldurFileOpx is an OPL program demonstrating some of the OPX's features.To use the OPX, add the following line near the top of you OPL source code:Include "AldurFile.oxh"and start writing your application.DistributionIf you intend distributing your application to others, you will need to ensure that your end-users get AldurFile.opx installed on their machines. To do this, you will need to include AldurFile.SIS with your distribution.If you are going to package your application in a .SIS file, you can simply include AldurFile.SIS as one of its components. This will ensure that as your application is installed, AldurFile is installed as well.If you distribute your application as discrete files, you will need to include AldurFile.SIS among them. Your end-user installation instructions will need to direct your users to install AldurFile.SIS.Note: On no account should you just include the AldurFile.opx file in your package, either as a component of a .SIS file or as a standalone file. Doing this would bypass the version-control system that EPOC uses and may result in your package overwriting a newer version of AldurFile.opx with an older one.Installing AldurFile.SIS on your users' machines will install the following files to their chosen drive:\System\Opl\AldurFile.oxh\System\Opx\AldurFile.opxIf you intend to make your application available for use with the PC-based Emulator, you should follow the instructions above, but use AldurFile-WINS.SIS in place of AldurFile.SIS.Note: The non-'DEV' versions of AldurFile's installation packages are provided so your end-users can use your application without cluttering up their systems with the help file and example OPL source included in the developer versions.If you think your end-users would benefit from these files, or your application is aimed at developers, feel free to include the 'DEV' version of the .SIS file in your distribution.┴G dх"h dhх"h dhх"п dпх" dG d Т╚ dWhЮ d L$К dу dк d4п0ЩЪЪ dпi d4╣ dЛп0ЩЪЪ dп╤8:х"х" х" х"х"х"х"х"Nх" х" х"8х" х" х" х"#х" х"=х" х"gх" х"Dх" х"х"2х"х"х" х"Tх" х"х"Oх" х"`х" х"х"х"*х" х"2х"х"═х" х"х" х" х"Qх"┤х"х" х" х"х"х"х" х"цх"╜KThe copyright in AldurFile √ the .SIS files and all component files √ is retained by the author, Graham L. Holden. The package, and/or any files within it, may only be used and distributed in accordance with the terms of this licence. If you cannot agree to be bound by the terms of the licence, you must stop using AldurFile and delete all copies of the .SIS files and any component files from your system(s).Personal UseEverybody is granted permission to use AldurFile to develop and run programs they develop for their own personal use, and to run any third-party programs they may acquire that make use of AldurFile.DistributionWhere permitted, AldurFile must only be distributed as one or more of the standard package files: AldurFileDEV.SIS, AldurFileDEV-WINS.SIS, AldurFile.SIS or AldurFile-WINS.SIS. No component file or files may be distributed outside of these packages.These four .SIS files may be freely distributed provided that no charge is made. The .SIS files may be made available for download on a website provided that no charge is made either to download the files or to join, or otherwise be able to access the files. The files may not be held on a 'pay' or commercial website unless they are freely available to all visitors without them having to pay, join or provide credit-card details.A link should be provided back to my website so that users can check for updated versions.Distribution of Developed ProgramsThe use of AldurFile to develop any program or application that you want to distribute to others is permitted providing the following conditions are observed:If you include AldurFile as part of your distribution, this can only be as one of the four .SIS files above, either as a standalone file, or preferably incorporated into your application's .SIS file. You may not distribute AldurFile's component files separately. Should you choose not to include AldurFile with your package (e.g. by relying on your users to acquire it for themselves) then the remaining conditions still apply.In your documentation and/or within the program (e.g. an 'About' screen) you must acknowledge your use of AldurFile and include a link to my website.Programs developed with AldurFile may be distributed as you see fit, e.g for free, as shareware or commercially.I would appreciate being informed of any use you make of AldurFile, partly for my own interest and partly so I can let people know if I release any updates. Offering me a free copy of anything you develop would be doubly-appreciated but is in no way compulsory.WarrantyThe software is offered "as is" with no warranty as to its suitability for any particular purpose. Your use of the software is entirely at your own risk and no liability will be accepted for any loss arising from the such use.However, without formally committing myself to any course of action, I will attempt to rectify any faults found in the software and would be glad for any feedback concerning the software.©B dх"'h≤ЧЪЪ dh З∙х" d ²т d d ╡[б d╝√qМ d╪ х"гх" х"bх"х"х"х"х" х"х"х"Lх"#х"÷х" х"Дх"VBAt the time of writing (September 2004), I can be reached by e-mail on:g-holden@dircon.co.ukand my website is at:www.g-holden.dircon.co.ukI also try to keep an eye on the Psion-related newsgroups, including:comp.sys.psion.appscomp.sys.psion.misccomp.sys.psion.programmerI appreciate any feedback on this package, especially bug reports and typos in the help text. Suggestions for new features or improved clarity of the documentation are welcome, but no promises are made!I love 'dabbling' on the Psion, so any requests for future OPXs will be given a reasonable hearing.Graham Holden.AA dх"h dhх"h dhх" d HFBлd d х"х"мLVersion 1.09, 20th September 2004Added the ability to combine two or more directory searches into one directory list:DirAppend&: and DirMerge&: allow entries to be appended (or sorted into) and existing list.DirOpenEmpty&: creates an empty list for the above to add to.Corresponding functions exist for Dir...UID&:.but note:At present, duplicates ARE NOT removed.All entries in a list must be from the same directory.Version 1.08, 20th November 2003A better attempt at meeting the request that triggered 1.07:DirNextHaving%: and DirNextLacking%: have been added to allow you to step through entries of the Current Directory List with or without certain attributes.IsOpen%:, DirIsOpen%:, and DirIsOpenAt%: have been added to test whether a file is open or not.Note: A couple of the constants defined in v1.07 have been superseeded (KRemoveIfOpen% and KRemoveIfClosed%).Version 1.07, 13th November 2003By request, and extra function:DirFilter: has been added which allows open or closed files to be filtered out of the Current Directory List.Version 1.06, 19th March 2003The first bug fix!DirOpen&: or DirSort: would panic if called with the new sort option KSortByDateAndName% for an empty directory.Version 1.05, 17th March 2003A couple of extra features added after using the OPX myself:The SetFmtTriadTails: command can be used to control the trailing strings of FmtTriad$: and DirSize$: when in "round to Kb or MB" mode.A new option, KSortByDateAndName%, is available with DirOpen&:, DirOpenUID&: and DirSort: (see below) to list files in day-groups sorted by name.DirSort: is available to re-sort an active directory list.Two synonyms have been added to AldurFile.oxh:ParseFilePath$: is equivalent to ParseDriveAndPath$:ParseFileName$: is equivalent to ParseFileAndExt$:Version 1.04, 12th March 2003(released with official UID)Implementation of earlier ideas/requests:A file's attributes can be returned as a formatted string, either directly from an active directory list or from a free-standing attribute value.see DirAttrib$:, DirAttribAt$:, FmtAttrib$: and SetFmtAttrib:.A file's size can be returned as a triad-separated string, either directly from an active directory list or from a free-standing size (or any numeric) value.see DirSize$:, DirSizeAt$:, FmtTriad$:, FmtTriadEx$: and SetFmtTriad:.A file's date/time of modification can be returned as a formatted string, either directly from an active directory list or from a free-standing date/time value.see DirDateTime$:, DirDate$:, DirTime$:, FmtDateTime$:, FmtDate$:, FmtTime$:, FmtDateTimeEx$:, FmtDateEx$:, FmtTimeEx$:, SetFmtDateTime:, SetFmtDate: and SetFmtTime:.Version 1.02, 3rd March 2003(now released as AldurFile.opx)Was already adding directory traversal functions when another poster on comp.sys.psion.programmer requested something similar.Added the DirXXX: functions to allow multiple directories to be scanned and accessed like an array.Added ParseXXX: functions to combine and split a filename from/into its components.Version 1.01, 25th February 2003(originally released as FileUtil.opx)Initial release in response to a plea for help on comp.sys.psion.programmer.Implemented Archive-attribute testing and setting;Implemented testing for a directory.@ dх" dх"'h≤ЧЪЪ dh З∙х"п0ЩЪЪ dпх" d,"U\'h≤ЧЪЪ dh З∙>'h≤ЧЪЪ dh З∙/'h≤ЧЪЪ dh З∙ ('h≤ЧЪЪ dh З∙7!=°'h≤ЧЪЪ dh З∙`'h≤ЧЪЪ dh З∙nп0ЩЪЪ dп! n'h≤ЧЪЪ dh З∙q'h≤ЧЪЪ dh З∙=┬'h≤ЧЪЪ dh З∙▓'h≤ЧЪЪ dh З∙ ;'h≤ЧЪЪ dh З∙/5'п≤ЧЪЪ dп З-3'п≤ЧЪЪ dп З-;п0ЩЪЪ dп*▓?'п≤ЧЪЪ dп З- ·G'п≤ЧЪЪ dп З- ║╖'п≤ЧЪЪ dп З-=п0ЩЪЪ dпdTGп0ЩЪЪ dпM3%u х"х" х"Bх"х"0х""х" х"аих"х"х" х"х"х"х"xх"х"х" х"х" х"8х"х"Bх"х"х"х"х" х"dх" х"х"х"0х"х"х"х"х"8х" х"х" х"#х"х"х"х" х"х" х"х"х"9х"х"3х"х"х"х"х"х"х"х"х"х"х"х" х"х" х"х" х"х" х"х"х" х"х" х"х" х"х" х"х" х"х"х" х"х" х"х" х"х" х"х" х"х" х"х"х"х" х"х" х"х"х"х" х"х" х"х"х"х"х"х"!х"х"#х"х"3PREM ----------REM AldurFile.OXH version 1.05REM Header File for AldurFile.OPXREM Copyright (c) Graham L. Holden, 2003.REM ----------REM ----------REM OPX identifier and versionConst KUidFileUtil& = &101F9BEEConst KFileUtilVersion% = $0105REM ----------REM Constants for DirOpen&:'s attribute selection parameter:Const KAttrNormal& = 0Const KAttrReadOnly& = $0001Const KAttrHidden& = $0002Const KAttrSystem& = $0004Const KAttrVolume& = $0008Const KAttrDir& = $0010Const KAttrArchive& = $0020Const KAttrAllFiles& = $002fConst KAttrAll& = $003fConst KAttrUseUIDs& = &10000000Const KAttrInclude& = &40000000Const KAttrExclude& = &08000000REM ----------REM Constants for DirOpen&:'s order-by parameter:Const KSortNone% = 0Const KSortByName% = 1Const KSortByExt% = 2Const KSortBySize% = 3Const KSortByDate% = 4Const KSortByUID% = 5Const KSortByDateAndName% = 100Const KSortAscend% = 0Const KSortDescend% = $0400Const KSortDirsDescend% = $0800Const KDirsAnyOrder% = 0Const KDirsFirst% = $0100Const KDirsLast% = $0200REM -----------------------------------------------------------REM Constants for DirFilter:Const KRemoveIfOpen% = $0001Const KRemoveIfClosed% = $0002REM -----------------------------------------------------------REM Constants for SetFmtTriad: and FmtTriadEx$:Const KForceSeparator% = -2Const KNoSeparator% = -1Const KUseLocale% = 0Const KRoundToKbOrMb% = -1REM ----------REM Functions provided by the OPXDeclare OPX AldurFile, KUidFileUtil&, KFileUtilVersion% IsArchive%:( aFile$ ) : 100 IsDirectory%:( aFile$ ) : 101 SetArchive:( aFile$, aBool% ) : 102 DirOpen&:( aFilespec$, aAttrMask&, aSortMode& ) : 200 DirOpenUID&:(aDirectory$, aUID1&, aUID2&, aUID3&, aSortMode&) : 201 DirCount%: : 202 DirClose&: : 203 DirUse:( aDirRef&) : 204 DirNext%: : 205 DirFirst: : 206 DirPosn%: : 207 DirPath$: : 208 DirGoto:(anEntry%) : 209 DirSort:( aSortMode&) : 210 DirName$: : 300 DirFullName$: : 301 DirSize&: : 302 DirDateTime&:( aDateTime& ) : 303 DirDate&: : 304 DirTime&: : 305 DirAttrib&: : 306 DirIsReadOnly%: : 307 DirIsSystem%: : 308 DirIsDirectory%: : 309 DirIsArchive%: : 310 DirIsHidden%: : 311 DirUID&:( aUidNo%) : 312 DirAttrib$: : 313 DirSize$: : 314 DirDateTime$: : 315 DirDate$: : 316 DirTime$: : 317 DirNameAt$:( anEntryNo%) : 350 DirFullNameAt$:( anEntryNo%) : 351 DirSizeAt&:( anEntryNo%) : 352 DirDateTimeAt&:( anEntryNo%, aDateTime&) : 353 DirDateAt&:( anEntryNo%) : 354 DirTimeAt&:( anEntryNo%) : 355 DirAttribAt&:( anEntryNo%) : 356 DirIsReadOnlyAt%:( anEntryNo%) : 357 DirIsSystemAt%:( anEntryNo%) : 358 DirIsDirectoryAt%:( anEntryNo%) : 359 DirIsArchiveAt%:( anEntryNo%) : 360 DirIsHiddenAt%:( anEntryNo%) : 361 DirUIDAt&:( anEntryNo%, aUidNo%) : 362 DirAttribAt$:( anEntryNo%) : 363 DirSizeAt$:( anEntryNo%) : 364 DirDateTimeAt$:( anEntryNo%) : 365 DirDateAt$:( anEntryNo%) : 366 DirTimeAt$:( anEntryNo%) : 367 ParseBuild$:( aFile1$, aFile2$, aFile3$ ) : 400 ParseDrive$:( aFilename$) : 401 ParsePath$:( aFilename$) : 402 ParseDriveAndPath$:( aFilename$) : 403 ParseFilePath$:( aFilename$) : 403 ParseName$:( aFilename$) : 404 ParseExt$:( aFilename$) : 405 ParseNameAndExt$:( aFilename$) : 406 ParseFileName$:( aFilename$) : 406 ParsePopDir$:( aFilename$) : 407 ParseIsRoot%:( aFilename$) : 408 ParseIsWild%:( aFilename$) : 409 ParseHasDrive%:( aFilename$) : 410 ParseHasPath%:( aFilename$) : 411 ParseHasName%:( aFilename$) : 412 ParseHasExt%:( aFilename$) : 413 FmtAttrib$:( aAttrib&) : 500 FmtTriad$:( aNumber&) : 501 FmtTriadEx$:( aNumber&, aWidth%, aChar%) : 502 FmtDateTime$:( aDateTime& ) : 503 FmtDate$:( aDaysSince1900& ) : 504 FmtTime$:( aSecsSinceMidnight& ) : 505 FmtDateTimeEx$:( aDateTime&, aFormat$ ) : 506 FmtDateEx$:( aDaysSince1900&, aFormat$ ) : 507 FmtTimeEx$:( aSecsSinceMidnight&, aFormat$ ) : 508 SetFmtAttrib:( aFormat$) : 550 SetFmtTriad:( aWidth%, aSeparator%) : 551 SetFmtDateTime:( aFormat$) : 552 SetFmtDate:( aFormat$) : 553 SetFmtTime:( aFormat$) : 554 SetFmtTriadTails:( aBytes$, aKB$, aMB$) :555End DeclareШB dх" d├"*  =   2  @@0"8%7G#!%!1!!#'%(&%)#!%!!1"!)%! '%###%$$#1#$(/04!,#0 ─LWhen you create a directory list using DirOpen&: or DirOpenUID&:, the OPX effectively builds an internal array of all the matching filenames and associated information (size, date, attributes etc.).As of v1.09, this list can be added to using DirAppend&: or DirMerge&: (or Dir...UID&: equivalents). An empty list can be created with DirOpenEmpty&:.Sequential AccessFor each directory list, the OPX maintains a Current Entry Pointer. Initially, this is set to before the first entry (i.e. at an imaginary 'zero'th entry).Whenever DirNext%: is called, the Current Entry Pointer is incremented to point to the next entry (if there is one). DirNext%: returns KTrue% or KFalse% to indicate whether there was another entry available. When called for the first time after opening a directory list, DirNext%: moves the pointer from the imaginary zeroth entry to the first real entry (unless the list was empty, in which case it does nothing except return KFalse%).The recommended way to scan the files is therefore:DirOpen&:( path$, attrMask&, sortMode% )while DirNext%: ... ProcessFile:( DirFullName$: ) ...endwhDirClose&:which will also work (but do nothing) if there were no matching entries.DirNextHaving%() and DirNextLacking%:() can also be used to step to the next entry the has (lacks) certain attributes.Enquiry FunctionsFunctions are provided to access the following information for the current entry:the filename (DirName$:)the full drive, path and filename (DirFullName$:)the file's size (DirSize&:)the file's last modified date (DirDateTime&:, DirDate&: and DirTime&:)the file's attributes, either individually (DirIsReadOnly%:, DirIsHidden%:, DirIsSystem%:, DirIsDirectory%:, or DirIsArchive%:) or all together (DirAttrib&:)one of the file's UIDs (DirUID&:)whether the file is open (DirIsOpen%:)the file's position within the directory list (DirPosn%:) √ from one to the number of entries in the list.You can also access the following information:the total number of entries (DirCount%:)the base drive and path of the list (DirPath$:) √ essentially DirFullName$: is the equivalent of DirPath$: + DirName$:.Random AccessBecause the OPX has already built a list of matching files when it returns from the DirOpen&: or DirOpenUID&: calls, you can access the names of entries and their other information as though they were held in arrays.You do this using the Dir...At: versions of the enquiry functions, where each function takes an entry number parameter as an 'array' index. The entry number runs from one to the total number of entries (as returned by DirCount%:).Accessing entries in this manner has no effect on the Current Entry Pointer, so you can safely intersperse 'array' access in the middle of a sequential scan.Moving the Current EntryYou can reposition the Current Entry Pointer:to before the first entry (DirFirst:) √ the same state as after the initial DirOpen&: or DirOpenUID&: call,to a given position (DirGoto:)Re-Ordering a ListOnce you have created a directory list, you can re-sort its entries with DirSort:.FinallyWhen you have finished using a directory list, DirClose&: should be called to free the resources used by the OPX.ЁO dх"h dhх" dг d≤ d ╞ d╥ d4sIw dd d'h≤ЧЪЪ dh З∙2'h≤ЧЪЪ dh З∙'h≤ЧЪЪ dh З∙G'h≤ЧЪЪ dh З∙·'h≤ЧЪЪ dh З∙ "'h≤ЧЪЪ dh З∙''h≤ЧЪЪ dh З∙k'h≤ЧЪЪ dh З∙/)'h≤ЧЪЪ dh З∙x'h≤ЧЪЪ dh З∙Г dХ d· dG dl'h≤ЧЪЪ dh З∙'h≤ЧЪЪ dh З∙f dz d{'х" х"х" х"┤х"-х" х"х" х"х" х"2х"х"х"х"-х"х"[х" х" х"х"х"?х" х" х"х"х"х"xх" х"⌠х"х"х"х"х"х"Pх"х"Rх"х" х"х"#х" х"х"х" х"х"х" х"х" х"х" х"х",х"х"х" х"х" х"х"х"х"х"х" х"х"х"х"х"х" х"х"/х" х"3х"х" х"х"%х" х"х" х"х"х"х"х"Tх" х"х" х"lх"х" х"╪х" х"х"6х"х"Sх"х"х"х"х"х" х"(х" х"х" х"х"х"х"х"х"Iх"х"х"х"/х" х"9х"@Unlike the standard OPL command DIR$(), calling DirOpen&: or DirOpenUID&: for a second time, while a previous directory list is still active, will create a new directory list √ it will not close or reset the first list.Active Directory ListAt all times, the OPX maintains an Active Directory List √ the most recently opened list √ and all directory functions operate on this list.If a second list is opened, the first list is remembered (together with its Current Entry Pointer) and the new list becomes the Active Directory List.After the active list is closed, if there was a previously remembered list, it is now made the Active Directory List and you can carry on scanning through its entries from where you left off.Within memory constraints, you can have as many open directory lists as you want √ the OPX imposes no artificial limits.Example Tree WalkThe following code shows how you can easily recurse through an entire directory tree using multiple directory lists:include "AldurFile.oxh"proc DirWalk: ScanDirectory:( "C:\" ) print "Finished." Getendpproc ScanDirectory:( baseDir$ ) DirOpen&:( baseDir$, KAttrAll&, KSortByName% ) print "Directory", baseDir$, "contains", DirCount%:, "files." while DirNext%: print " ", DirName$: endwh print DirFirst: while DirNext%: if DirIsDirectory%: ScanDirectory:( DirFullName$: + "\" ) endif endwh DirClose&:endpEach list is scanned twice, once to print its contents and once to look for sub-directories. Whenever a sub-directory is found, a recursive call to ScanDirectory: is made and a new directory list is opened. When all sub-directories (and their sub-directories) have been processed, the current list is closed and the previous (i.e. the parent directo╒гry's list) is made active.The "\" needs to be appended to DirFullName&: so that the files in the directory, not the directory itself, are included in the subsequent list.Directory List ReferencesAldurFile was designed so that for the most common tasks, scanning a single directory or traversing a directory tree, the programmer doesn't need to worry about which directory list is active ≈ as long as you close the lists in reverse order of opening them (as happens in the DirWalk: example), you will always be returned to the correct previous list when you call DirClose&:.If you need to use multiple lists in other ways (e.g. swapping back and forth between a number of directories), you can do this, but you will generally need to manage which list is active yourself.List management is achieved through Directory References √ one of these is returned whenever you open a new list with DirOpen&: or DirOpenUID&:. You can then switch between multiple lists using DirUse:, as in the following outline:dirRef1& = DirOpen&:( "C:\FirstDirectory\", ... )dirRef2& = DirOpen&:( "C:\SecondDirectory\", ... )...... processing SecondDirectory...DirUse:( dirRef1& )...... processing FirstDirectory...DirUse:( dirRef2& )...... back in SecondDirectory...DirUse:( dirRef1& )DirClose&:DirUse:( dirRef2& )DirClose&:Note: When using multiple lists in this way, it is probably safest to be fairly explicit in your use of DirUse: calls, especially after a DirClose&:. After closing the active list, DirClose&: makes the last list (in the OPX's internal array of lists) the newly-active list. With just the two lists as shown above there's probably no problem, but if you have three or more lists, and/or are frequently opening and closing them, DirClose&: may not reactivate the list you're expecting. In case it's useful to anyone, DirClose&: returns the directory reference of the newly-active list (or zero if there are no lists left open).sF dх"h dhх" dэ d ё d≈ dю dy┤ d÷z▒ d∙ dфИ d <uп0ЩЪЪ dп 3 х"х" х" х"х" х"Sх"х"=х"х"#х"х"Uх"Lх"х"х"х"х"_х"х"Lх"х"uх" х" х"dх"х"oх" х"х"$х"х">х" х"х" х"4х"х"х"х"bх"х"х" х""х" х"Мх" х"Oх" х"eх"HIt is now possible to add additional entries to an existing directory list, using DirAppend&:, DirMerge&:, DirAppendUID&: or DirMergeUID&:.However, any given list can only contain entries for files in the same directory.The "home directory" for a list will normally be given in the DirOpen&: or DirOpenEmpty&: call. All subsequent calls to DirAppend&: or DirMerge&: must either use the same directory path or omit the path completely (in which case the existing "home directory" will be used).If a call to DirAppend&: or DirMerge&: specifies a different directory, an error will be generated.Appending to an existing list will leave the order of current entries untouched; the new entries will be sorted by whatever sort& parameter is given, and then added to the end of the existing list.Merging with an existing list will add the new entries to the existing list, and then sort the whole lot (both new and old) according to the sort& parameter given.For this reason, it only makes sense to use one of the DirMerge&: functions as the last in a chain of additions. It also makes sense that any earlier DirAppend&: calls specify KSortNone%, since any sorting done then will be "thrown away" when DirMerge&: is called.The above discussions apply also to the Dir...UID&: variants.Examples:DirOpen&:( "c:\files\*", KAttrDir&, KSortByName%)DirAppend&:( "*.txt", KAllFiles&, KSortByName%)will create a list of all directories in "C:\Files", followed by all "*.txt" files; both parts will be sorted by name.DirOpenEmpty&:( "C:\Files\")DirAppend&:( "*.txt", KAllFiles&, KSortNone%)DirAppend&:( "*.doc", KAllFiles&, KSortNone%)DirMerge&:( "*.htm", KAllFiles&, KSortByName%)will build a combined list of all text, document and HTML files in the given directory, all sorted by name. Note the use of KSortNone%. This would be equivalent to:DirOpenEmpty&:( "C:\Files\")DirAppend&:( "*.txt", KAllFiles&, KSortNone%)DirAppend&:( "*.doc", KAllFiles&, KSortNone%)DirAppend&:( "*.htm", KAllFiles&, KSortNone% )DirSort:( KSortByName%)╟E dх"h dhх" d▄ d R d d dф d╓ d  d > d dw╛╖ dд,Rх" х"х" х"х"х"х" х"х">х" х"х"х" х" х"х" х"│х" х" х"х" х">х"|х"х"Eх"█х"х"х"7х" х"Vх" х"х" х"9х" х" х"(х" х" х"}х" х" х"$SUsage:DirOpen&:( file$, attr&, sort& )DirOpenUID&:( file$, uid1&, uid2&, uid3&, sort& )These commands offer alternatives to OPL's standard DIR$() function.Both forms build a list of files and or directories that can be stepped through in order or accessed like an array. It is also possible to maintain multiple lists simultaneously √ see Multiple Dir Lists.Once a list is open, it is possible to add new entries to it √ see DirAppend&: and DirMerge&:.The third form creates an empty list, optionally setting the directory from which entries will be added; you will need to use DirAppend&: or DirMerge&: before it will be of much use. See Adding to Dir Lists for more on this.Example:DirOpen&:( "C:\*.txt", KAttrAllFiles&, KSortByName% )while DirNext%: print DirName$:endwhDirClose&:The file$ parameter specifies which files to list, and can include wildcards in the filename or extension portion (e.g. "C:\*.txt" or "C:\File1.*"). If file$ is a directory, the trailing backslash must be included (e.g. "C:\Documents\"). If omitted, you would get a single-entry list with just the directory itself listed.The attr& parameter allows the list of files to be filtered according to the attributes they may or may not posses. The following values can be used in various combinations (constants are defined in AldurFile.oxh):0 KDirNormal&Lists 'normal files'; omits directories and any file with the System or Hidden attributes set.$0001 KAttrReadOnly&Includes entries with the ReadOnly attribute set.$0002 KAttrHidden&Includes entries with the Hidden attribute set.$0004 KAttrSystem&Includes entries with the System attribute set.$0008 KAttrVolume&Includes entries with the Volume attribute set (I don't think Epoc makes much use of this).$0010 KAttrDir&Includes directory entries.$0020 KAttrArchive&Includes entries with the Archive attribute set.$002f KAttrAllFiles&Includes all files (including System and Hidden) but omits directories.$003f KAttrAll&Includes all files and directories.&10000000 KAttrUseUIDs&Allows the UIDs of selected files to be examined √ see DirGetUID&:.&40000000 KAttrInclude&Selects files only if they have the indicated attributes set. This is mainly of use with KAttrReadOnly& and KAttrArchive&, since entries are normally included whether or not a file has these attributes. E.g.:(0) would list all files with or without ReadOnly attribute;(KAttrReadOnly&) would also list the same files; but(KAttrReadOnly& OR KAttrInclude&) would only list read-only files.&08000000 KAttrExclude&Selects only those entries without the other specified attributes. Following on from the examples above:(KAttrReadOnly& OR KAttrExclude&) would only list non-read-only (i.e. writeable) files.The uid1&, uid2&, and uid3& parameters allow the list of files to be filtered by matching one or more of the three UIDs that Epoc stores at the beginning of all native files. A non-zero value for any of these parameters means that a file will only be included in the list if its corresponding UID matches.The sort& parameter controls the ordering of the list of files produced. Possible values are (constants defined in AldurFile.oxh):0 KSortNone%1 KSortByName%2 KSortByExt% (sorts by extension)3 KSortBySize%4 KSortByDate%5 KSortByUID%100 KSortByDateAndName%one of these can be combined with certain combinations of:0 KDirsAnyOrder%$0100 KDirsFirst%$0200 KDirsLast%0 KSortAscend%$0400 KSortDescend%$0800 KSortDirsDescend%Note: If the KSortByUID% option is used, it effectively turns on the KAttrUseUIDs& option.Note: The KSortByDateAndName% option first orders entries in descending date order (ignoring the time component); entries with the same date of modification are sorted in ascending name order. The nett effect is to show all today's files in name-order, followed by all yesterday's files and so on.Once a directory list has been opened using either form of this function, an internal pointer is kept to indicate which entry is current. You can use DirNext%: as in the example above to step through each entry in turn, using functions like DirName$: and DirSize&: etc. to access information about the entries.Important: When you have finished using a directory list, you should call DirClose&: to free up resources within the OPX.Tip: As well as stepping through the entries in order, you can also use the DirxxxAt: versions of the access functions to essentially treat the list as an array. You can also use DirFirst:, DirPosn%: and DirGoto: to move the current pointer manually.Tip: You can also use DirSort: to change the order of the active directory list, without re-scanning the file-system.Note: The return-code from DirOpen&: and DirOpenUID&: is a reference to the directory list created; for most uses, you will not need to worry about this, but see the topic Multiple Dir Lists for more on this subject.JN dх"п0ЩЪЪ dпх" d0Z'h≤ЧЪЪ dh З∙Eм d_ dБ dq'h≤ЧЪЪ dh З∙E dь dmGCCo,E]4\п0ЩЪЪ dпКп0ЩЪЪ dп='8≤ЧЪЪ d8 З-5'8≤ЧЪЪ d8 З-C'8≤ЧЪЪ d8 З-┌п0ЩЪЪ dпX'8≤ЧЪЪ d8 З-3 d└ d #;[п0ЩЪЪ dп+п0ЩЪЪ dп8 dz╟PШЪЪ d╟Эп0ЩЪЪ dп vп0ЩЪЪ dпып0ЩЪЪ dпkх"Sх"╧х"х"х"Cх" х"х" х"х"~х" х"х" х"%х"х"х" х"hх"х"х"░х"х"╖х"х"х"©х" х"х"Oх" х"х"&х"х"ах"х":х"х"%х"!х"х"х"х"3х"х"Hх"!х"х"х",х"х"х"х"х"х"х"х"х"х"kх" х"х"х"х" х"-х" х" х"х"х"х"х"≈х" х"Rх" х"х" х"/х" х"?х" х"&х"х"Gх"х"х"х"_х" х"х" х"х"х"'х"х"х"х"Xх"х"х" х"х" х"wх"х"х"÷BUsage:DirOpenEmpty&:( filepath$)DirOpenEmptyUID&:( filepath$)These functions create an empty directory list which can be added to using DirAppend&:, DirAppendUID&:, DirMerge&: or DIrMergeUID&:.filepath$ specifies the directory from which all entries will be taken (subsequent calls to te above functions need only specify the file and extension mask to use). An empty path (e.g. "") can be used if you don't want to specify the directory yet.Note: As with DirOpen&: and DirOpenUID&:, this call must be paired with a corresponding DirClose&:.Note: There is actually only one function; DirOpenEmptyUID&: only exists as a synonym in the .OXH file for convenience.@ц dB'h≤ЧЪЪ dh З∙┘ d Ш ddп0ЩЪЪ dпxп0ЩЪЪ dпх";х"Kх" х"х"х"х" х"х" х"х" х"Рх"х"х" х"х" х"0х" х"х"х"%х"х"<х"pFUsage:DirAppend&:( file$, attr&, sort& )DirMerge&:( file$, attr&, sort& )DirAppendUID&:( file$, uid1&, uid2&, uid3&, sort& )DirMergeUID&:( file$, uid1&, uid2&, uid3&, sort& )These commands allow additional entries to be added to an existing directory list. The parameters and their meanings are exactly the same as the DirOpen: group of functions.DirAppend&: and DirAppendUID&: will leave any existing list untouched; new entries will be sorted as a group (according to sort&) and added to the end.DirMerge&: and DirMergeUID&: will add new entries to any existing list and then sort all entries (both old and new) according to sort&. It is equivalent to calling DirAppend&: followed by DirSort:.These calls can be used multiple times to build up a growing list of files.See Adding to Dir Lists for more on adding entries to an existing list.Important: At present, all entries in a single directory list must be in the same directory. An error will occur if you try to combine entries from different directories.Tip: Because entries can only come from the same directory, the drive and path can be omitted from file$ (e.g. just "*.txt" is valid).Tip: Because DirMerge&: and DirMergeUID&: sort the whole list, it only makes sense to call them at the end of a sequence of additions.Similarly, if DirMerge&: or DirSort: is going to be used, it makes sense to use KSortNone%: for any intervening additions.Note: At present, duplicate entries are not removed from the combined list; if a file was already in the active directory list and a call to one of these functions refers to it again, there will be two entries in the final list.МE dх" d Ё'h≤ЧЪЪ dh З∙╞ d≤ dг d LH d╛╟PШЪЪ d╟┤п0ЩЪЪ dп┤п0ЩЪЪ dп{п dпЕп0ЩЪЪ dп-х"╛х"▓х"х"х" х"х"х"]х"х"х" х"х" х"eх"х"х" х" х"х"х"х"х"1х" х"║х"х"^х"х"х"х"х" х"х" х"^х"х" х"х"х",х" х" х"х"ъх"bFUsage:while DirNext%: ...endwh..or.. DirNextHaving%:( anyAttribs&, allAttribs&)..or.. DirNextLacking%:( anyAttribs&, allAttribs&)DirNext%: advances the internal pointer of an opened directory list to the next entry if there is one and returns KTrue% (-1). If the pointer is already at the end of the list (or the list is empty), the return code is KFalse% (0).DirNextHaving%: and DirNextLacking%: operate in a similar manner, but will skip over entries that fail to have (or lack) a given set of attributes. For both functions, zero for either parameter means 'don't perform that test'; otherwise the logic is as follows:For DirNextHaving%:, an entry is skipped if either:none of the attributes in anyAttribs& are present, orany of the attributes in allAttribs& are absent.For DirNextLacking%:, an entry is skipped if either:all the attributes in anyAttribs& are present (i.e. it doesn't lack any of them), orany of the attributes in allAttribs& are present (i.e. it doesn't lack all of them).The attributes that can be tested for are (constants defined in AldurFile.oxh):$0001 KAttrReadOnly&Tests the ReadOnly attribute.$0002 KAttrHidden&Tests the Hidden attribute.$0004 KAttrSystem&Tests the System attribute.$0008 KAttrVolume&Tests the Volume attribute (I don't think Epoc makes much use of this).$0010 KAttrDir&Tests whether an entry is a directory.$0020 KAttrArchive&Tests the Archive attribute.&00010000 KFileOpen&Tests to see if the entry is open.&00020000 KFileClosed&Tests to see if the entry is closed.Important: These functions should not be called if there is no active directory list.╚Eп0ЩЪЪ dпх" d┴'h≤ЧЪЪ dh З∙И d d4'h≤ЧЪЪ dh З∙6'п≤ЧЪЪ dп З-1'п≤ЧЪЪ dп З-5'h≤ЧЪЪ dh З∙U'п≤ЧЪЪ dп З-U'п≤ЧЪЪ dп З-P d3//[718<V╟PШЪЪ d╟#х"┌х" х"iх"х"dх"х"х"х"х"х"Цх"х"х"!х"х" х"х"х" х" х"х"х"!х"х" х"4х"х" х"1х"@х" х"х" х"Kх".AUsage:DirClose&:Closes the current directory list and frees the associated resources used by the OPX.If there are no other directory lists open, the command returns zero; otherwise it returns the reference to the now-active list. See the topic Multiple Dir Lists for more on using multiple lists./A dх" d'h≤ЧЪЪ dh З∙Vе dх" х"░х"х"#х"╚BUsage:DirFilter:( aFilter&)Allows entries to be removed from the active directory list if they match certain conditions. The following values for aFilter& are recognised (constants are defined in AldurFile.oxh):&00010000 KFileOpen&Removes entries which refer to open files.&00020000 KFileClosed&Removes entries which refer to closed files.Note: After calling this function, the number of entries in the active directory list may be reduced, possibly leaving an empty list.Note: On return, the Current Entry Pointer will be set to the beginning of the list, as if DirFirst: had been used.Important: This function should not be called if there is no active directory list.цBп0ЩЪЪ dпх" d'h≤ЧЪЪ dh З∙╨ d@D├п0ЩЪЪ dпtп0ЩЪЪ dпT╟PШЪЪ d╟х"х"xх"х"*х" х"х"х"─х"х"х"х"1х" х"х" х"Iх" CUsage:attr& = DirAttrib&:attr& = DirAttribAt&:( entry% )attr$ = DirAttrib$:attr$ = DirAttribAt$:( entry% )Returns the file attributes of the current entry, or the selected entry% of the active directory list. Individual attributes can be tested by ANDing with the KAttr...& constants defined in AldurFile.oxh.The string versions return the attributes as a formatted string; by default of the form "rhsa" where a letter is present if the attribute is set or replaced by a space if unset. See also FmtAttrib$: and SetFmtAttrib: for formatting options.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.GC do'h≤ЧЪЪ dh З∙м dР dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"hх"Bх"х"Wх" х"х" х"х"╪х" х"х" х"х"х"х"х"х"х"х" х"Iх" х"5х""AUsage:count% = DirCount%:Returns the number of entries in the active directory list (which may be zero). Unlike the DIR$() command, the number of entries is available as soon as a list has been opened.Important: This function should not be called if there is no active directory list.A dх" d'h≤ЧЪЪ dh З∙╡T╟PШЪЪ d╟х"х" х"Iх"GEUsage:DirDateTime&:( dateTime& )days& = DirDate&:secs& = DirTime&:DirDateTimeAt&:( entry%, dateTime& )days& = DirDateAt&:( entry% )secs& = DirTimeAt&:( entry% )str$ = DirDateTime$:str$ = DirDate$:str$ = DirTime$:str$ = DirDateTimeAt$:( entry% )str$ = DirDateAt$:( entry% )str$ = DirTimeAt$:( entry% )These return the last modification date and/or time of the current entry, or the selected entry% of the active directory list in the following ways:DirDateTime&: and DirDateTimeAt&: set the date/time object whose ID is dateTime& (as created by dtNow&:) and return the ID. If zero is passed in, they will create a new date/time object, set its value and return the new ID.DirDate&: and DirDateAt&: return the date portion as days since 1900 (as used by dDate/Days/DaysToDate).DirTime&: and DirTimeAt&: return the time portion as seconds since midnight (as used by dTime).Each of these functions also have a version that returns the date and/or time as a string, e.g. DirDateTime$: and DirTimeAt$: etc. See the entry for FmtDateTime$: and SetFmtDateTime: for details of the strings' formats and how to change them.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list. F d 9'h≤ЧЪЪ dh З∙∙ dА'h≤ЧЪЪ dh З∙i'h≤ЧЪЪ dh З∙ `'h≤ЧЪЪ dh З∙Т d Fп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟0х"2х"Zх"х"5х" х"х"х"&х" х"х"х"zх" х"х" х"8х"х"х"х"х" х"х" х"х" х"?х"х"х"`х" х"х" х"х" х"х"х"=х"х"х"х"х"х"х" х"Iх" х"5х"XBUsage:DirFirst:Positions the Current Entry Pointer of the active directory list to the beginning of the list, allowing you to re-scan the list with DirNext&:.Important: This function should not be called if there is no active directory list.Note: The pointer is actually positioned before the first entry (if any) of the list. The following is the suggested way of using DirFirst:DirOpen&:(...)while DirNext%: ... REM first pass through listendwhDirFirst:while DirNext%: ... REM second pass through listendwhDirClose&:Note: It is safe to call this function even if the list is empty.yBп dпх" d'h≤ЧЪЪ dh З∙░ dT╟PШЪЪ d╟█п0ЩЪЪ dп⌠Bп0ЩЪЪ dпх" х"х"х"bх" х"х" х"Iх"х"}х" х"х"<х":AUsage:DirGoto:( entry% )Positions the Current Entry Pointer of the active directory list to position entry% (which should be between 1 and the number of entries).Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.тA d'h≤ЧЪЪ dh З∙▀ dT╟PШЪЪ d╟@╟PШЪЪ d╟ х"х"х"х"*х"х"8х" х"Iх" х"5х"@Usage:flag% = DirIsArchive%:flag% = DirIsArchiveAt%:( entry% )Returns KTrue% (-1) if the current entry, or the selected entry% of the active directory list has the Archive attribute set, KFalse% (0)Лю if it is unset.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.ЁB dA'h≤ЧЪЪ dh З∙≥ dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х":х"х"х",х"х"=х"х"х"х"х"х"х"х"х" х"Iх" х"5х"╣AUsage:flag% = DirIsDirectory%:flag% = DirIsDirectoryAt%:( entry% )Returns KTrue% (-1) if the current entry, or the selected entry% of the active directory list is a directory, KFalse% (0) if it is an ordinary file.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.ЁB dE'h≤ЧЪЪ dh З∙∙ dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х">х"х"х",х"х".х"х" х"х"х"х"х"х"х" х"Iх" х"5х"╡AUsage:flag% = DirIsHidden%:flag% = DirIsHiddenAt%:( entry% )Returns KTrue% (-1) if the current entry, or the selected entry% of the active directory list has the Hidden attribute set, KFalse% (0) if it is unset.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.ЁB d?'h≤ЧЪЪ dh З∙≤ dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"8х"х"х",х"х"<х"х"х"х"х"х"х"х"х" х"Iх" х"5х"нAUsage:flag% = DirIsOpen%:flag% = DirIsOpenAt%:( entry% )Returns KTrue% (-1) if the file referred to by the current entry, or the selected entry% of the active directory list has been opened by some process(es), KFalse% (0) if it is closed.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.ЁB d;'h≤ЧЪЪ dh З∙╦ dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"4х"х"х"Dх"х"Cх"х"х"х"х"х"х"х"х" х"Iх" х"5х"╦AUsage:flag% = DirIsReadOnly%:flag% = DirIsReadOnlyAt%:( entry% )Returns KTrue% (-1) if the current entry, or the selected entry% of the active directory list has the ReadOnly attribute set, KFalse% (0) if it is unset.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.ЁB dC'h≤ЧЪЪ dh З∙  dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"<х"х"х",х"х">х"х"х"х"х"х"х"х"х" х"Iх" х"5х"╡AUsage:flag% = DirIsSystem%:flag% = DirIsSystemAt%:( entry% )Returns KTrue% (-1) if the current entry, or the selected entry% of the active directory list has the System attribute set, KFalse% (0) if it is unset.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.ЁB d?'h≤ЧЪЪ dh З∙≤ dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"8х"х"х",х"х"<х"х"х"х"х"х"х"х"х" х"Iх" х"5х"+BUsage:file$ = DirName$:file$ = DirNameAt$:( entry% )file$ = DirFullName$:file$ = DirFullNameAt$:( entry% )Returns the name of the current entry, or the selected entry% of the active directory list. Returns either just the filename and the extension (which will be relative to DirPath$:) or the full name including drive and path.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.┘B do'h≤ЧЪЪ dh З∙А dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"hх"7х"х"nх" х"-х"х"х"х"х"х"х" х"Iх" х"5х"AUsage:path$ = DirPath$:Returns the drive and path of the files in the active directory list.Example:DirOpen&:( "C:\Documents\*.txt", ... )print DirPath$:will print the string "C:\Documents\".Important: This function should not be called if there is no active directory list.┘A dх" d'h≤ЧЪЪ dh З∙F@'h≤ЧЪЪ dh З∙'T╟PШЪЪ d╟х"х" х"7х" х"Iх"GAUsage:posn% = DirPosn%:Returns the current entry position within the active directory list. The value will be between 1 and the number of entries (as returned by DirCount%:).Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.╕A d'h≤ЧЪЪ dh З∙≥ dT╟PШЪЪ d╟@╟PШЪЪ d╟ х"х"▄х" х"х" х"Iх" х"5х"tBUsage:size& = DirSize&:size& = DirSizeAt&:( entry% )size$ = DirSize$:size$ = DirSizeAt$:( entry% )Returns the file size in bytes of the current entry, or the selected entry% of the active directory list.The string versions return the file size as a comma (or locale-specific) separated string, optionally rounded to kilobytes and megabytes. See also FmtTriad$: and SetFmtTriad: for formatting options.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.КB dg'h≤ЧЪЪ dh З∙j dх dFп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟х"`х"Eх"х"х"■х" х"х" х"х"х"х"х"х"х"х" х"Iх" х"5х"A d'h≤ЧЪЪ dh З∙` dT╟PШЪЪ d╟ х"х"4х" х"х" х"х" х"Iх"цBUsage:uid& = DirUID&:( uidNo% )uid& = DirUIDAt&:( entry%, uidNo% )Returns one of the UIDs of the current entry, or the selected entry% of the active directory list. uidNo% should be 1, 2 or 3.UIDs are only accessible if either:the KAttrUseUIDs& option was included in the attr& parameter of the original DirOpen&: call, orthe KSortByUID% option was included in the sort& parameter of the original DirOpen&: call, orthe active directory list was opened with the DirOpenUID&: call.Note: The Dir...At functions do not update the Current Entry Pointer.Important: This function should not be called if there is no active directory list.Important: This function should not be called on an empty list.шD dх" d E'h≤ЧЪЪ dh З∙─ d$`'h≤ЧЪЪ dh З∙^'h≤ЧЪЪ dh З∙A'h≤ЧЪЪ dh З∙Fп0ЩЪЪ dпT╟PШЪЪ d╟@╟PШЪЪ d╟"х">х">х"х" х"х"х"х" х"х"х"х" х" х"х" х"х"х"х" х" х".х" х"х"х"х"х"х"х"х" х"Iх" х"5х"AUsage:DirUse:( dirRef& )When working with multiple directory lists, this command makes the given list the active one. dirRef& should be the value returned from a previous DirOpen&: or DirOpenUID&: call.See the topic Multiple Dir Lists for more on using multiple lists.╬A d'h≤ЧЪЪ dh З∙╢ dC d х"х"_х"х".х" х"х" х"х"х"х"#х"HUsage:attr$ = FmtAttrib$:( attrib& )SetFmtAttrib:( format$ )FmtAttrib$: returns a string-representation of attrib&, assumed to be a file's attributes.The default format is a four character string of the form "rhsa" representing the presence or absence of the four attributes ReadOnly, Hidden, System and Archive. Each letter is replaced by a space if the corresponding attribute is not set.SetFmtAttrib: specifies a new format for FmtAttrib$:'s response. Within format$, special attribute-formatting commands are enclosed between percent signs (e.g. "...%xxx%..."); characters outside of percent signs are returned unaltered.An empty attribute-formatting command (e.g. "...%%...") is replaced by a single percent sign in FmtAttrib$:'s response, otherwise the first character after the percent sign is a flag √ a single character that identifies the attribute to be tested:r ReadOnlyh Hiddens Systema Archivev Volume-labeld Directorythe following forms can be used:%flag%is replaced by the single letter flag if the attribute is set, or a space if it is unset.%flagXXX%is replaced by the string XXX if the attribute is set, or nothing if it is unset.%flagXXX:YYY%is replaced by the string XXX if the attribute is set, or YYY if it is unset.flag can be in either upper or lower case, and case is preserved in the first form above.Specifying an empty format string, i.e. SetFmtAttrib:( "" ), returns to the default behaviour (which would be equivalent to, but slower than: SetFmtAttrib:( "%r%%h%%s%%a%" )).The following example:SetFmtAttrib:( "%rR/O:---% %hHid:---% %sSys:---% %aArc:---% %dDIR:---%" )would give output like:--- --- --- --- ---R/O --- --- --- ---R/O Hid --- Arc ------ --- Sys --- DIRAlso:SetFmtAttrib:( "R:%rX:-% H:%hX:-% S:%sX:-% A:%aX:-% D:%dX:-%" )would give output like:R:- H:- S:- A:- D:-R:X H:- S:- A:- D:-R:X H:X S:- A:X D:-R:- H:- S:X A:- D:XNote: The setting of SetFmtAttrib: also controls the format returned by DirAttrib$: and DirAttribAt$: √ essentially DirAttrib$: is equivalent to FmtAttrib$:( DirAttrib&: ).@ dх"'h≤ЧЪЪ dh З∙х"h dhх" d?'h≤ЧЪЪ dh З∙[ dРМ dЬ d     !a'h≤ЧЪЪ dh З∙\'h≤ЧЪЪ dh З∙\'h≤ЧЪЪ dh З∙Z d╟ d3еJP@P╜п0ЩЪЪ dп 6х"8х" х"$х"х"%х" х"х" х"х"х"Rх" х"@х"-х"х"+х" х"Gх"х"Bх"х"!х"х"5х" х"х"х"5х"х"х"х"х"х"х"х"Vх"(х"х"Sх"х"х"х"х" х"&х" х"х" х"х" х"х"х"х"ЕM dх"'h≤ЧЪЪ dh З∙х"п0ЩЪЪ dпх"h dhх" dCI'h≤ЧЪЪ dh З∙X do'h≤ЧЪЪ dh З∙`'h≤ЧЪЪ dh З∙ W'h≤ЧЪЪ dh З∙  Д dЭ╟X d}┐HH}╤\╝·п0ЩЪЪ dп°п0ЩЪЪ dп┌v dй║`  mп0ЩЪЪ dпп dп█ dЖ dэ dОп0ЩЪЪ dп>├п0ЩЪЪ dп_THtv]_f\xyxpqv d└[t%v d√ dсп0ЩЪЪ dпbх"Bх"~х" х"пх" х"х"х"&х" х"х"х"х" х"х" х"/х"х"х"х"х" х"х" х"х" х"6х"х"х"Nх" х"1х" х"Qх"х"Aх"uх"х"#х"tх"х"#х"gх" х"х"х"gх"Sх"х"gх"х"Zх"х"vх"2х"х"╪х"0х"х"ёх"х"Xх"х"≤х"х"Их"9х"х"=х"х" х"gх" х"х"х" х"Oх"х" х"Gх"х"/х"х"х" х"&х" х"х" х"х" х"х"х"х" х"х" х"х"*A d"'h≤ЧЪЪ dh З∙╛ dх"х"х"х"wх"х" х"*A d$'h≤ЧЪЪ dh З∙[ dх"х"х"х"6х"х"х"*A d'h≤ЧЪЪ dh З∙q dх"х"х"х"@х"х"х"уB dх" d 6'h≤ЧЪЪ dh З∙─j▐'h≤ЧЪЪ dh З∙&Фп0ЩЪЪ dп{п dпLп0ЩЪЪ dпх"/х" х"├х"х"тх"х"х"sх" х"≈х" х"=х"х"+х"х"х"Bх"х"х"вcUsage:str$ = FmtDateTime$:( dateTime& )str$ = FmtDate$:( daysSince1900& )str$ = FmtTime$:( secsSinceMidnight& )SetFmtDateTime:( format$ )SetFmtDate:( format$ )SetFmtTime:( format$ )str$ = FmtDateTimeEx$:( dateTime&, format$ )str$ = FmtDateEx$:( daysSince1900&, format$ )str$ = FmtTimeEx$:( secsSinceMidnight&, format$ )The first three functions format a given date and/or time in one of three default ways, returning them as strings. The three SetFmtXXX: functions allow you to change the default formats used by them. The final three functions allow the format to be specified on a call-by-call basis (without altering the format returned by the first three).FmtDateTime$: and FmtDateTimeEx$: use the date/time object whose ID is dateTime& (e.g. as created by dtNow&:).FmtDate$: and FmtDateEx$: use the number of days since 1900 (as used by dDate/Days/DaysToDate).FmtTime$: and FmtTimeEx$: use the number of seconds since midnight (as used by dTime).The first three functions have a default format which takes full account of localisation settings (i.e. dd/mm/yy vs. mm/dd/yy etc. and whether to use a 12 or 24 hour clock). For standard British settings, the three functions will give results similar to:09:45:21 am 28/02/0328/02/0309:45:21 amTo specify your own date/time formats, either to change the defaults with the SetFmtXXX: functions, or for a one-off conversion with the FmtXXXEx$: functions, you will need to understand EPOC's date and time formatting strings.Within a formatting string, special fields are introduced by the percent-sign ("%") √ these are replaced by components of the date or time, or otherwise affect the format produced. All other characters of the string are copied to the output verbatim.Many of the special fields can be introduced by "%*" which will give an abbreviated version of the normal field, e.g. remove leading zeros, use "Tue" instead of "Tuesday" etc.Time Formatting FieldsThe following fields place time components in the output string:%H specifies two-digit hours in 24-hour format, irrespective of the locale-settings. Abbreviation removes any leading zero.%I specifies two-digit hours in 12-hour format, irrespective of the locale-settings. Abbreviation removes any leading zero**.%J specifies two-digit hours in 12- or 24-hour format, according to the locale-settings. Abbreviation removes any leading zero**.%T specifies two-digit minutes. Abbreviation removes any leading zero.%S specifies two-digit seconds. Abbreviation removes any leading zero.%C specifies six-digit microseconds. Abbreviation, of the form "%*0C" to "%*6C", indicates the number of digits to display.%:n (where 'n' is 0 to 3) specifies one of the four locale-specific time separator characters. These occur before the time (%:0), between hours and minutes (%:1), between minutes and seconds (%:2) and after the time (%:3). Seconds and microseconds, if used, are separated by "%." (see below). For standard British format, the leading and trailing characters (0 & 3) are empty and the other two (1 & 2) are a colon (giving "12:34:56").%:. specifies the locale-specific decimal separator, used between seconds and microseconds.%A specifies "am" or "pm", irrespective of the 12/24-hour locale-setting. A space mayor may not be inserted according to the locale; abbreviation will never insert a space.%-A as for "%A", except the text is only inserted if the locale-setting indicates that the am/pm symbol should occur before the time. Cannot be abbreviated.%+A as for "%A", except the text is only inserted if the locale-setting indicate that the am/pm symbol should occur after the time. Cannot be abbreviated.%B, %-B, %+B as for the "%A" variants, except the am/pm symbol is only generated if the locale-settings indicate a 12-hour clock.Putting all the above together, the fully locale-sensitive time format, used as the default string for FmtTime$:, is:%-B%:0%J%:1%M%:2%S%:3%+B(i.e., a leading, trailing or no am/pm symbol according to the locale, with the hours, minutes and seconds separated and surrounded by the locale-specific characters). If microseconds are wanted, use:%-B%:0%J%:1%T%:2%S%.%C%:3%+BIf some components are omitted, the intervening "%:1" and/or "%:2" should be omitted as appropriate, but the leading and trailing "%:0" and "%:3" should remain.If you don't want to adapt to the locale-settings, then a 12-hour format could be as simple as:%I:%T:%S%Aand a 24-hour format would be:%H:%T:%SNote: ** The default EPOC behaviour of "%I" and "%J" is to strip any leading zero; always (for "%I") and when in 12-hour format (for "%J"), even when not abbreviated. This is contrary to the behaviour of all other specifiers, makes column alignment awkward, and for good measure, the Shell's "Properties" dialog displays a file's time and date with leading zeros!Because of this, I have mangled the formatting code so that the first "%I" or "%J" will give a leading zero, even in 12-hour mode. Abbreviated ("%*I" or "%*J"), the zero will be stripped. Note: this only works for the first "%I" or "%J", but it seems unlikely to have more than one.Date Formatting FieldsThere is a complication with date formatting: basically, there are two modes; locale-independent or locale-dependent.In locale-independent mode (the formatting string includes "%F"), the specifiers %1 through to %5 (see below) aren't needed, and should not be used. Day, date, month and year components are substituted for exactly as specified (by %D, %M etc.).In locale-dependent mode (the formatting string does not include "%F"), where the order of day, month and year varies from area to area, there is an additional complication. The specifiers %1 through to %5 are used to specify where the substitutions should take place; specifiers such as %D and %M only serve to define what should be substituted (i.e. whether to use a month's name, or it's number; whether it should be abbreviated or not); the order of these is immaterial.Note: The above explanation is my interpretation of the EPOC SDK's help pages, and is not guaranteed to be 100% accurate. The built-in formats seem to work as expected, but if you're defining your own formats, you may need to experiment!With the above in mind, the following specifiers can be used:%F if present, locale-independent mode is used (%1 to %5 not needed); if absent, locale-dependent mode is used (%1 to %5 are needed).%D specifies two-digit day number in the month (1-31). Abbreviation removes any leading zero.%M specifies two-digit month number (1-12). Abbreviation removes any leading zero.%Y specifies the four-digit year. Abbreviation gives a two-digit year.%E specifies the day name in full. Abbreviation is language-specific (e.g. the first three characters in English).%N specifies the month name in full. Abbreviation is language-specific (e.g. the first three characters in English).%W specifies the week-number within the year (1-53). Abbreviation removes any leading zero.%X specifies the cardinal date suffix (e.g. "st", "nd", "rd" or "th"). Cannot be abbreviated.%Z specifies the three-digit day number in the year (1-366). Abbreviation removes any leading zeros.%/n (where 'n' is 0 to 3) specifies one of the four locale-specific date separator characters. These occur before the date (%/0), after the date (%/3) and between the three date components (%/1 and %/2). For standard British format, the leading and trailing characters (0 & 3) are empty and the other two (1 & 2) are a slash (giving "28/02/03").%1 specifies the first component of a three-component date (i.e. day, month or year, according to the locale-settings).%2 specifies the second component of a three-component date (i.e. day, month or year, according to the locale-settings).%3 specifies the third component of a three-component date (i.e. day, month or year, according to the locale-settings).%4 specifies the first component of a two-component date (i.e. day or month, according to the locale-settings).%5 specifies the second component of a two-component date (i.e. day or month, according to the locale-settings).Putting all the above together, the fully locale-sensitive date format, used as the default string for FmtDate$:, is:%D%M%*Y%/0%1%/1%2%/2%3%/3(the order of the D, M and Y specifiers does not matter; they just specify which format the %1 through %3 components should be in).Ignoring the locale-settings, a British-formatted date (dd/mm/yy) could be generated with:%F%D/%M/%Y (e.g. 28/02/03)where the %F is needed to ignore locale-settings. The following format-string generates "verbose" dates, as shown:%F%N, %D%X, %Y (February 28th, 2003)The default format of the FmtDateTime$: call is a combination of the default time string and the default date string.If one of the SetFmtXXX: functions is called with an empty string (e.g. ""), the corresponding FmtXXX$: function reverts to using its default string.Note: The setting of SetFmtDate: also controls the format returned by DirDate$: and DirDateAt$: √ essentially DirDate$: is equivalent to FmtDate$:( DirDate&: ). The same applies to DirDateTime$: and DirTime$:.@Usage:str$ = FmtTriad$:( number& )str$ = FmtTriad$Ex:( number&, width%, separator% )SetFmtTriad:( width%, separator% )SetFmtTriadTails:( byte$, kB$, MB$ )FmtTriad$: returns number& as a string with locale-specific thousands separators, e.g. "1,234" or "1.234.567".FmtTriadEx$: converts number& using width% and separator% (as defined for SetFmtTriad:) for one instance only √ the 'remembered' settings for subsequent calls to FmtTriad$: are not affected.SetFmtTriad: can be used to adjust the result of FmtTriad$:if width% is positive (> 0), the string is right-justified by padding with leading spaces, e.g. a vкalue of 8 would give "^^^1,234" (where ^ represents a space). If the string is wider than width%, it is returned in full.A value of zero for width% (the initial default) gives no padding.If width% is negative, then number& is taken to be a size in bytes, and is rounded to kilobytes or megabytes as appropriate. Example results are: "567", "1,234", "23K", "987K", "11M" etc. (but see SetFmtTriadTails: below).The absolute value of width% is used to right-justify the results as before, so a width% of -6 would give: "^^^567", "^1,234", "^^^23K", "^^987K", "^^^11M".Tip: As with a positive width%, longer results are not truncated, so -1 (or KRoundToKbOrMb%) will effectively give no padding (since all results are at least one character long).separator% specifies whether a separator character should be used between each group of three digits, and if so, what it should be. Possible values are:-2 KForceSeparator%The locale-specific separator character will be used, even if the locale-settings say not to use it.-1 KNoSeparator%No separator will be used, whatever the locale-settings say.0 KUseLocale% (initial default)The separator character, and whether to use it, are both taken from the locale-settings.+ve character codeThe specified ASCII code is used as a separator, completely ignoring the locale-settings.Tip: To specify a fixed separator, use OPL's "%" notation for the ASCII code of the following character, as in SetFmtTriad:( 0, %, ).Note: Locale-specific settings are only read from the system when your program first starts or when SetFmtTriad: is called. Changes made in the Psion's control panel while your OPL program is running will not be seen until the user restarts the program or your program calls SetFmtTriad:.Note: The setting of SetFmtTriad: also controls the format returned by DirSize$: and DirSizeAt$: √ essentially DirSize$: is a short-cut for FmtTriad$:( DirSize&: ).Tip: If you want to use the same format (width% and separator% values) for many conversions, or with DirSize$: or DirSizeAt$:, then call SetFmtTriad: once. If you only want to use each format a couple of times each, call FmtTriadEx$: and specify width% and separator% each time.SetFmtTriadTails: controls the suffices when "size-rounding" is active (i.e. when width% is negative). After rounding the size to bytes, kilobytes or megabytes, the normal action is to append nothing for bytes, "K" for kilobytes or "M" for megabytes. Using SetFmtTriadTails: allows this to be altered. For example,SetFmtTriadTails:( " bytes", "kB", "MB" )will cause DirSize$:, FmtTriad$: and FmtTriadEx$: to produce strings like:5,345 bytes32kB12MBNote: Using an empty string for any parameter to SetFmtTriadTails: will revert to the default settings ("" for bytes, "K" for kilobytes and "M" for megabytes).└Mп0ЩЪЪ dпх"h dhх" d÷'h≤ЧЪЪ dh З∙o d© d< dч'h≤ЧЪЪ dh З∙C'h≤ЧЪЪ dh З∙Ю'h≤ЧЪЪ dh З∙²h dhЁп0ЩЪЪ dп 'h≤ЧЪЪ dh З∙yNym├п0ЩЪЪ dп"п0ЩЪЪ dп╔п0ЩЪЪ dп п0ЩЪЪ dп> d*K d═п0ЩЪЪ dпpх"≤х" х" х"х"Uх" х" х"х"х"х"х" х"х" х"х"х"5х" х"х" х"%х" х"х"х"╣х"х"х"х"х")х"х"х"х"х"ёх"х" х"х"х"6х"х"х"х"?х"х"х"х"'х"х"х"х"Xх" х"░х"х"jх"х"х"х"^х" х"╓х" х"х"х"х" х"&х" х"х" х"х" х"х"х"х"х"$х"х"х" х"'х" х"х" х" х" х"Iх" х" х"х"х" х" х"х"Aх"х"╚х"х"*х" х" х"х" х"х" х"х"х"+х"х"^х"┐DUsage:file$ = ParseBuild$:( file1$, file2$, file3$ )Combines filename components (drive, path, name and extension) from the three file specifications to build a complete filepath.Can be useful for generating a specific full-spec filename from partial components and/or a default path.Example:newExt$ = ".obj"sourceFile$ = "myfile.c"defaultPath$ = "C:\MySource\"objFile$ = ParseBuild$:( newExt$, sourceFile$, defaultPath$ )would return "C:\MySource\myfile.obj"Note: ParseBuild$: splits each of the three paths into four components; drive, path, filename and extension. The return value is formed by taking the the each of these components from the first path that contains that component.In the example above, newExt$ specifies an extension, so this becomes part of the final path. It specifies no other components, so we consider sourceFile$. This specifies both a filename and extension, but we already have an extension, so only the filename component is used in the final path. Finally, defaultPath$ is used to supply the remaining components: drive and path.Note: If you only want to combine two paths, use "" for the last parameter.QA dY'h≤ЧЪЪ dh З∙F d:п0ЩЪЪ dпх"Rх"?х"х"х"х"4х"XA d('h≤ЧЪЪ dh З∙Y d х"!х"х"х" х"х"х"х"х"XA d&'h≤ЧЪЪ dh З∙] d х"х"х"х" х"х"!х"х"х"XA d''h≤ЧЪЪ dh З∙\ d х" х"х"х" х"х" х"х"х"XA d''h≤ЧЪЪ dh З∙X d х" х"х"х" х"х"х"х"х"XA d('h≤ЧЪЪ dh З∙╒ d х"!х"х"х" х"х"kх"х"х"▒AUsage:isWild% = ParseIsWild%:( file$ )Returns KTrue% (-1) if the filename or extension components of file$ contain a wildcard; KFalse% (0) if it is fully specified.Tip: Wildcards are "*" to mean any number of characters or "?" to mean any single character. They can only occur in the filename or extension components. E.g., all these would return KTrue%:"*.dat""ABC?.txt""C:\Documents\?.hlp"Bп dпх" d('h≤ЧЪЪ dh З∙ dап0ЩЪЪ dп( х"!х"х"х"1х"х"х"х"х"х"╢х"х"х"QA dU'h≤ЧЪЪ dh З∙L d:п0ЩЪЪ dпх"Nх"Eх"х"х"х"4х"зAUsage:parent$ = ParsePopDir$:( file$ )Returns file$ with the deepest component of its path removed. file$ may or may not contain a filename/extension component.Example:parent$ = ParsePopDir$:( "C:\DirA\DirB\" )REM returns "C:\DirA\"file$ = ParsePopDir$:( "C:\MySource\myfile.c" )REM returns "C:\myfile.c"Note: If file$ does not contain a path component (i.e. it is the root directory or specifies a file in the root directory), the return value will be unchanged.B d('h≤ЧЪЪ dh З∙| d∙'h≤ЧЪЪ dh З∙═п0ЩЪЪ dп х"!х"х"х"2х"х"8х" х"▄х"х"х"х"▓х"*A d%'h≤ЧЪЪ dh З∙^ dх"х" х"х"х"х"-х"╔I%ЪЪЗП}ТЭЕ╣yE▒mЖЖ▒╞AldurFile OPX v1.09R d"Q╞ AldurFile!╞ InstallationR  d "й ┴ AldurFile!╞LicenceR d" ╜ © AldurFile!╞ Contact MeR  d " V A AldurFile!#Graham Holden Author website e-mail╞ RevisionsR  d " м в AldurFile!╞ AldurFile.oxhR d "3Ш AldurFile!╞Directory ListsR d"─ Ё AldurFile!xDirOpen&: DirOpenUID&: DirUse: DirClose&: DirPosn%: DirGoto: DirNext%: DirFirst: DirOpenEmpty&: DirAppend&: DirMerge&: D╞Multiple Dir ListsR d"vs AldurFile!)DirOpen&: DirOpenUID&: DirUse: DirClose&:╞Adding to Dir ListsR d"╟ AldurFile!YDirOpen&: DirOpenUID&: DirOpenEmpty&: DirAppend&: DirMerge&: DirAppendUID&: DirMergeUID&:╞DirOpen&:DirOpenUID&:R d"$J AldurFile!╞ DirOpenEmpty&:DirOpenEmptyUID&:R! d "÷7 AldurFile!╞3DirAppend&:DirMerge&:DirAppendUID&:DirMergeUID&:R4 d3"pМ AldurFile!╞*DirNext%:DirNextHaving%:DirNextLacking%:R+ d*"b╚ AldurFile!╞ DirClose&:R  d ". / AldurFile!╞ DirFilter:R  d "!╚"ц AldurFile!╞3DirAttrib&:DirAttribAt&:DirAttrib$:DirAttribAt$:R4 d3"# $G AldurFile!@EЪЪЖяТРAQ9)I9▒ТТq╞ DirCount%:R  d "&"' AldurFile!╞]DirDateTime&:DirDate&:DirTime&:DirDateTimeAt&:DirDateAt&:DirTimeAt&:DirXxx$:DirXxxAt$:╝^ dM"""""(G)  AldurFile!IDirDateTime$: DirDate$: DirTime$: DirDateTimeAt$: DirDateAt$: DirTimeAt$:╞ DirFirst:R  d "*X+y AldurFile!╞DirGoto:R  d",:-т AldurFile!╞DirIsArchive%:DirIsArchiveAt%:R  d".╣/Ё AldurFile!╞#DirIsDirectory%:DirIsDirectoryAt%:R$ d#"0╣1Ё AldurFile!╞DirIsHidden%:DirIsHiddenAt%:R d"2╡3Ё AldurFile!╞DirIsOpen%:DirIsOpenAt%:R d"4н5Ё AldurFile!╞!DirIsReadOnly%:DirIsReadOnlyAt%:R" d!"6╦7Ё AldurFile!╞DirIsSystem%:DirIsSystemAt%:R d"8╡9Ё AldurFile!╞3DirName$:DirNameAt$:DirFullName$:DirFullNameAt$:R4 d3":+;┘ AldurFile!╞ DirPath$:R =ц d "<=┘ AldurFile!╞ DirPosn%:R  d ">G?╕ AldurFile!╞+DirSize&:DirSizeAt&:DirSize$:DirSizeAt$:R, d+"@tAК AldurFile!©DirSort:R  d"рUsage:DirSort:( sortMode& )Re-sorts the entries of the active directory list. sortMode& is the same as used in DirOpen&:.Important: This function should not be called if there is no active directory list.B AldurFile!╞DirUID&:DirUIDAt&:R d"CцDш AldurFile!ЭF?Э!²!ЭЕ╞ ParseIsWild%:R d "Z▒[ AldurFile!Ъ ParseName$:R  d "^Usage:name$ = ParseName$:( file$ )Returns the filename component (e.g. "myfile") of file$.Э d$'h≤ЧЪЪ dh З∙9 dх"х"2х"х"х" AldurFile!©!ParseNameAndExt$:ParseFileName$:R" d!"эUsage:nameAndExt$ = ParseNameAndExt$:( file$ )filename$ = ParseFileName$:( file$ )Returns the filename and extension components (e.g. "myfile.obj") of file$.Note: The two function names are synonyms for each other.\Q AldurFile!Ъ ParsePath$:R  d "^Usage:path$ = ParsePath$:( file$ )Returns the path component (e.g. "\MySource\") of file$.Э d$'h≤ЧЪЪ dh З∙9 dх"х"2х"х"х" AldurFile!╞ ParsePopDir$:R d "]з^ AldurFile!© SetArchive:R  d "└Usage:SetArchive:( aFile$, aFlag% )Sets (if aFlag% is non-zero) or clears (if aFlag% is zero) the Archive bit of the given file._* AldurFile!╨PYЪЪП▒┴Ущ З%²ММЯА ╞DirUse:R d"FG╬ AldurFile!╞FmtAttrib$:SetFmtAttrib:R d"HI² AldurFile!DirAttrib$: DirAttribAt$:╞qFmtDateTime$:FmtDate$:FmtTime$:SetFmtDateTime:SetFmtDate:SetFmtTime:FmtDateTimeEx$:FmtDateEx$:FmtTimeEx$:Rr dq"Jв#KЕ AldurFile!╞6FmtTriad$:FmtTriadEx$:SetFmtTriad:SetFmtTriadTails:R7 d6"Lp M└ AldurFile!DirSize$: DirSizeAt$:© IsArchive%:R  d "оUsage:a% = IsArchive%:( aFile$ )Returns KTrue% (-1) if the given file has the Archive attribute set (i.e. it has been created or modified since the last backup), or KFalse% (0) if the attribute is clear.N* AldurFile!© IsDirectory%:R d "─Usage:a% = IsDirectory%:( aFile$ )Returns KTrue% (-1) if the given filename represents a directory or KFalse% (0) otherwise.O* AldurFile!©IsOpen%:R  d"▒Usage:a% = IsOpen%:( aFile$ )Returns KTrue% (-1) if the given file has been opened by some process(es), or KFalse% (0) if the file is closed.P* AldurFile!╞ ParseBuild$:R  d "Q┐Rу AldurFile!Ъ ParseDrive$:R  d "^Usage:drive$ = ParseDrive$:( file$ )Returns the drive-name component (e.g. "C:") of file$.Э d&'h≤ЧЪЪ dh З∙7 dх"х"0х"х"х" AldurFile!©#ParseDriveAndPath$:ParseFilePath$:R$ d#"зUsage:driveAndPath$ = ParseDriveAndPath$:( file$ )filepath$ = ParseFilePath$:( file$ )Returns the drive and path components (e.g. "C:\MySource\") of file$.Note: The two function names are synonyms for each other.SQ AldurFile!Ъ ParseExt$:R  d "[Usage:ext$ = ParseExt$:( file$ )Returns the extension component (e.g. ".obj") of file$.Э d"'h≤ЧЪЪ dh З∙8 dх"х"1х"х"х" AldurFile!©ParseHasDrive%:R d"┌Usage:flag% = ParseHasDrive%:( file$ )Returns KTrue% (-1) if the file$ contains a drive component; KFalse% (0) if it does not.TX AldurFile!© ParseHasExt%:R d "└Usage:flag% = ParseHasExt%:( file$ )Returns KTrue% (-1) if the file$ contains a extension component; KFalse% (0) if it does not.UX AldurFile!©ParseHasName%:R d"└Usage:flag% = ParseHasName%:( file$ )Returns KTrue% (-1) if the file$ contains a filename component; KFalse% (0) if it does not.VX AldurFile!©ParseHasPath%:R d"─Usage:flag% = ParseHasPath%:( file$ )Returns KTrue% (-1) if the file$ contains a path component; KFalse% (0) if it does not.WX AldurFile!© ParseIsRoot%:R d "кUsage:isRoot% = ParseIsRoot%:( file$ )Returns KTrue% (-1) if the file$ specifies a root directory (e.g. "C:\") or a filename in a root directory (e.g. "D:\myfile.txt"); returns KFalse% (0) otherwise.XX AldurFile!║@Table1title x °ЪЪЪdbodyЪЪЪЪ°ЪЪЪdapp x °ЪЪЪdsynonym x °ЪЪЪdэ@OOOOЪЪЪЪOOOOЪЪЪЪ┌dd;╞ ╣╧┘©&─)ь+-Й9цIЬYУ\wi,y╓┤▌√я⌡В╝C╫Д©ц▐и~оБу▐ш©эПщ²ЮbЦmФБ╦╤ИзЙЗКCЯPВ╙Ы%ЭaЩ7ЪНёZц x HЩ╥l у┴╕-!v"$■&│)+г-=й╓2╦3x5√=╩Y5E■}▀SHTtU▄≤═V²d·╬÷║r╒лё?ц&╔╧╕о╗"╙Ч╚╝Ызw°ш├▌;@O&─ЪЪЪДYЪЪЪ@E)@ .`┴a1b7c2e┌de;╞ ╣╧┘©&─)ь+-Й9цIЬYУ\wi,y╓┤▌√я⌡В╝C╫Д©ц▐и~оБу▐ш©эПщ²ЮbЦmФБ╦╤ИзЙЗКCЯPВ╙Ы%ЭaЩ7ЪНёZц x HЩ╥l у┴╕-!v"$■&│)+г-=й╓2╦3x5√=╩Y5E■}▀SHTtU▄≤═V²d·╬÷║r╒лё?ц&╔╧╕о╗"╙Ч╚╝Ызw°ш╧чач|ч7m┘ТcUл\cdHREM ------------------------------------------------REM Test file to show some of the functions ofREM AldurFile.OpxREM ------------------------------------------------include "Const.oph"include "AldurFile.oxh"Const TempFile$ = "C:\AldurFile.Temp"proc AldurFileOpx: MergeAndAppend: Filtering: ModifyFlag: ParseFile: DirectoryWalk:endpproc MergeAndAppend: DirOpenEmpty&:( "") DirAppend&:( "C:\Documents\A*", KAttrAll&, KSortByName% ORKSortDescend% ) while DirNext%: print DirAttrib$:, DirName$: endwh print "..."; : Get : Print DirMerge&:( "J*", KAttrAll&, KSortByName% ORKSortDescend% ) DirFirst: while DirNext%: print DirAttrib$:, DirName$: endwh print "..."; : Get : Print DirClose&:endpproc Filtering: DirOpen&:( "C:\AldurSoft\AldurFileOpx\*.*", 0, 0 ) print "Complete: ("; DirCount%:; ")" while DirNext%: print " "; DirIsOpen%:, DirAttrib$:, DirName$: endwh print "..."; : Get : Printprint "a"  DirFirst:print "b" print "Skipping: ("; DirCount%:; ")" while DirNextHaving%:( KFileOpen&OR KAttrReadOnly&, KAttrArchive& ) print " "; DirIsOpen%:, DirAttrib$:, DirName$: endwh print "..."; : Get :Print DirFilter:( KFileClosed&) DirFirst: print "Filtered: ("; DirCount%:; ")" while DirNext%: print " "; DirIsOpen%:, DirAttrib$:, DirName$: endwh print "..."; : Get :Printendpproc ModifyFlag: CLS print "Creating a temporary file:", TempFile$ LOpen TempFile$ LPrint "Test Test Test Test Test Test" LPrint "Test Test Test Test Test Test" LPrint "Test Test Test Test Test Test" LClose print  print "Examining ARCIHVE flag:" ExamineArchive:( TempFile$)  print  print "Clearing the ARCHIVE flag:" SetArchive:( TempFile$, KFalse%) ExamineArchive:( TempFile$)  print  print "Deleting temporary file:" Delete TempFile$  print  print "Press a key to continue..."; Getendpproc ExamineArchive:( aFilename$) print "File '"; aFilename$; "' has the Archive flag", if IsArchive%:( aFilename$) print "SET" else print "CLEAR" endifendpConst AnExt$ = ".c"Const AFile$ = "SomeFile.h"Const APath$ = "C:\Source\SomeProject\"proc ParseFile: local fileName$( 255 ) CLS print "Combining:" print " "; AnExt$ print " "; AFile$ print " "; APath$ print "to give:" filename$ = ParseBuild$:( AnExt$, AFile$, APath$) print " "; filename$  print print "Splitting into parts:" print " Drive:", ParseDrive$:( filename$ ) print " Path:", ParsePath$:( filename$ ) print " Drive and path:", ParseDriveAndPath$:( filename$ ) print " Name:", ParseName$:( filename$ ) print " Extension:", ParseExt$:( filename$ ) print " Name and extension:", ParseNameAndExt$:( filename$ )  print print "Moving up..." print IfTrue$:( ParseIsRoot%:( filename$ ), "ROOT"," "), print filename$ filename$ = ParsePopDir$:( filename$) print IfTrue$:( ParseIsRoot%:( filename$ ), "ROOT"," "), print filename$ filename$ = ParsePopDir$:( filename$) print IfTrue$:( ParseIsRoot%:( filename$ ), "ROOT"," "), print filename$ print  print "Press a key to continue..."; Getendpproc DirectoryWalk: Global abandon% Global nonStop% CLS SetFmtAttrib:( "%rR/O:---% %hHid:---% %sSys:---% %aArc:---% %dDIR:---%" ) SetFmtAttrib:( "R:%rX:-% H:%hX:-% S:%sX:-% A:%aX:-% D:%dX:-%" ) SetFmtTriad:( -12, 0) SetFmtTriadTails:( " bytes", " kB ", " MB ") SetFmtDateTime:( "%F%D/%M/%Y" ) WalkTree:( "C:\") print  print "Press a key to continue..."; Getendpproc WalkTree:( aDir$) local ch$(1) if abandon% return endif DirOpen&:( aDir$, &3f, 0) print "Listing", DirCount%:, "files in", DirPath$: while DirNext%: print Gen$( DirPosn%:, -5), IF 0 print IfTrue$:( DirIsArchive%:, "Arc", " "), print IfTrue$:( DirIsHidden%:, "Hid", " "), print IfTrue$:( DirIsSystem%:, "Sys", " "), print IfTrue$:( DirIsReadOnly%:, "R/O", " "), print IfTrue$:( DirIsDirectory%:, "Dir", " "), ENDIF print DirAttrib$:, print DirSize$:, print DirDateTime$:, print DirName$: endwh if NOT nonStop% print "", ch$ = Upper$( Get$) print abandon% = ( ch$ = "Q" ) nonStop% = ( ch$ = "C" ) if ch$ = "E" error: endif endif print if NOT abandon%  DirFirst: while DirNext%: if DirIsDirectory%: WalkTree:( DirFullName$: + "\" ) endif endwh endif DirClose&: returnendpproc error: print asasasas%endpproc IfTrue$:( aCond%, aIfTrue$, aIfFalse$) if aCond% return aIfTrue$ else return aIfFalse$ endifendpпп════\c&efd\c.efd┌.фA┘*Texted.app┘6┴╫7m┘ТcUИ\cdu`REM -----------------------------------------------------------REM AldurFile.OXH version 1.10REM Header File for AldurFile.OPXREM Copyright (c) Graham L. Holden, 2003-4.REM -----------------------------------------------------------REM -----------------------------------------------------------REM OPX identifier and versionConst KUidFileUtil& = &101F9BEEConst KFileUtilVersion% = $010aREM -----------------------------------------------------------REM Constants for DirOpen&:'s attribute selection parameter:Const KAttrNormal& = 0Const KAttrReadOnly& = $0001Const KAttrHidden& = $0002Const KAttrSystem& = $0004Const KAttrVolume& = $0008Const KAttrDir& = $0010Const KAttrArchive& = $0020Const KAttrAllFiles& = $002fConst KAttrAll& = $003fConst KAttrUseUIDs& = &10000000Const KAttrInclude& = &40000000Const KAttrExclude& = &08000000REM -----------------------------------------------------------REM Constants for DirFilter: (need to fit in with above)Const KFileOpen& = &00010000Const KFileClosed& = &00020000REM -----------------------------------------------------------REM Constants for DirOpen&:'s order-by parameter:Const KSortNone% = 0Const KSortByName% = 1Const KSortByExt% = 2Const KSortBySize% = 3Const KSortByDate% = 4Const KSortByUID% = 5Const KSortByDateAndName% = 100Const KSortAscend% = 0Const KSortDescend% = $0400Const KSortDirsDescend% = $0800Const KDirsAnyOrder% = 0Const KDirsFirst% = $0100Const KDirsLast% = $0200REM -----------------------------------------------------------REM Constants for SetFmtTriad: and FmtTriadEx$:Const KForceSeparator% = -2Const KNoSeparator% = -1Const KUseLocale% = 0Const KRoundToKbOrMb% = -1REM -----------------------------------------------------------REM Functions provided by the OPXDeclare OPX AldurFile, KUidFileUtil&, KFileUtilVersion% IsArchive%:( aFile$ ) : 100 IsDirectory%:( aFile$ ) : 101 SetArchive:( aFile$, aBool% ) : 102 IsOpen%:( aFile$) : 103 DirOpen&:( aFilespec$, aAttrMask&, aSortMode& ) : 200 DirOpenUID&:(aDirectory$, aUID1&, aUID2&, aUID3&, aSortMode&) : 201 DirCount%: : 202 DirClose&: : 203 DirUse:( aDirRef&) : 204 DirNext%: : 205 DirFirst: : 206 DirPosn%: : 207 DirPath$: : 208 DirGoto:(anEntry%) : 209 DirSort:( aSortMode&) : 210 DirFilter:( aFilter&) : 211 DirNextHaving%:( anyAttr&, allAttr& ) : 212 DirNextLacking%:( anyAttr&, allAttr& ) : 213 DirOpenEmpty&:( aDirSpec$ ) : 220 DirOpenEmptyUID&:( aDirSpec$ ) : 220 DirAppend&:( aFilespec$, aAttrMask&, aSortMode& ) : 221 DirMerge&:( aFilespec$, aAttrMask&, aSortMode& ) : 222 DirAppendUID&:(aDirectory$, aUID1&, aUID2&, aUID3&, aSortMode&) : 223 DirMergeUID&:(aDirectory$, aUID1&, aUID2&, aUID3&, aSortMode&) : 224 DirName$: : 300 DirFullName$: : 301 DirSize&: : 302 DirDateTime&:( aDateTime& ) : 303 DirDate&: : 304 DirTime&: : 305 DirAttrib&: : 306 DirIsReadOnly%: : 307 DirIsSystem%: : 308 DirIsDirectory%: : 309 DirIsArchive%: : 310 DirIsHidden%: : 311 DirUID&:( aUidNo%) : 312 DirAttrib$: : 313 DirSize$: : 314 DirDateTime$: : 315 DirDate$: : 316 DirTime$: : 317 DirIsOpen%: : 318 DirNameAt$:( anEntryNo%) : 350 DirFullNameAt$:( anEntryNo%) : 351 DirSizeAt&:( anEntryNo%) : 352 DirDateTimeAt&:( anEntryNo%, aDateTime&) : 353 DirDateAt&:( anEntryNo%) : 354 DirTimeAt&:( anEntryNo%) : 355 DirAttribAt&:( anEntryNo%) : 356 DirIsReadOnlyAt%:( anEntryNo%) : 357 DirIsSystemAt%:( anEntryNo%) : 358 DirIsDirectoryAt%:( anEntryNo%) : 359 DirIsArchiveAt%:( anEntryNo%) : 360 DirIsHiddenAt%:( anEntryNo%) : 361 DirUIDAt&:( anEntryNo%, aUidNo%) : 362 DirAttribAt$:( anEntryNo%) : 363 DirSizeAt$:( anEntryNo%) : 364 DirDateTimeAt$:( anEntryNo%) : 365 DirDateAt$:( anEntryNo%) : 366 DirTimeAt$:( anEntryNo%) : 367 DirIsOpenAt&:( anEntryNo%) : 368 ParseBuild$:( aFile1$, aFile2$, aFile3$ ) : 400 ParseDrive$:( aFilename$) : 401 ParsePath$:( aFilename$) : 402 ParseDriveAndPath$:( aFilename$) : 403 ParseFilePath$:( aFilename$) : 403 ParseName$:( aFilename$) : 404 ParseExt$:( aFilename$) : 405 ParseNameAndExt$:( aFilename$) : 406 ParseFileName$:( aFilename$) : 406 ParsePopDir$:( aFilename$) : 407 ParseIsRoot%:( aFilename$) : 408 ParseIsWild%:( aFilename$) : 409 ParseHasDrive%:( aFilename$) : 410 ParseHasPath%:( aFilename$) : 411 ParseHasName%:( aFilename$) : 412 ParseHasExt%:( aFilename$) : 413 FmtAttrib$:( aAttrib&) : 500 FmtTriad$:( aNumber&) : 501 FmtTriadEx$:( aNumber&, aWidth%, aChar%) : 502 FmtDateTime$:( aDateTime& ) : 503 FmtDate$:( aDaysSince1900& ) : 504 FmtTime$:( aSecsSinceMidnight& ) : 505 FmtDateTimeEx$:( aDateTime&, aFormat$ ) : 506 FmtDateEx$:( aDaysSince1900&, aFormat$ ) : 507 FmtTimeEx$:( aSecsSinceMidnight&, aFormat$ ) : 508 SetFmtAttrib:( aFormat$) : 550 SetFmtTriad:( aWidth%, aSeparator%) : 551 SetFmtDateTime:( aFormat$) : 552 SetFmtDate:( aFormat$) : 553 SetFmtTime:( aFormat$) : 554 SetFmtTriadTails:( aBytes$, aKB$, aMB$) :555End Declareпп════\cCefd\cKefd┌.фA┘*Texted.app┘S┴зMZ░ЪЪ╦@─╨╢ м!╦Lм!This program cannot be run in DOS mode. $PEL∙ШkAЮ ! pT─Юp┌J═Pп╟─8$ёт.text╥np `.rdata╨─t@@.datae░x@ю.idata═z@ю.CRT ╟ ┌@ю.E32_UIDю▄@ю.reloc┤п▌@BИ*&ИV[ИgИыИ%ИBZИ!ИhWИШИ│Иj'ИkИъ[ИЙVИ%WИ═UИьИИJИ\OИ╥JИl:ИЭИRИ⌠UИы$ИUИтИ░И┼ZИX0И@.И│<ИVVИ!UИИ&И"\ИLИxQИёLИИсИdSИRИ IИZИ╟JИ[PИ├QИQRИPИZИTИЪOИйLИ╔WИЮRИJИжWИ▒JИ°OИ"ИбTИ]PИH%И#VИаИu%И!ИИXИNИ[И;OИ╛И- ИlKИjИIИMNИD.И▐ИТИ╧PИ╢RИ▐UИN#И╔QИ6(И└ИVLИ>И▄YИ╪И╡И╫YИXWИЖИЧ ИtИ$TИ⌠И┼SИ5VИпYИКUИжTИИ╫ИZИRИ╪ И╨И3NИ~SИЖИ.И▐OИЗLИLИ═VИ╩XИЦИяVИЫ7И7MИ╒HИ╠И8VИе!ИLИ╠ИdOИ ИWИO!И0IИэ ИцИАXИюИМ И2HИмPИьOИА8ИMИ╘UИkИоPИ[8И5LИ WИв Иё ИПИ(.И░И╝ИWИХSИх6ИнOИ)UИYИи И*HИ%RлллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллU▀Л┐Л▀EPh░█MЬХИTPХщT┐д▀Е]цU▀Л▀EPХжT┐д]цU▀Л▀EE PХбT┐д]цU▀Л▀EPХ╥T┐д]цU▀Л▀EPХ╛T┐д]цU▀Л▀EPhX▒Х°T┐д]цU▀ЛhX▒Х░T┐д]цU▀Л▀E P▀MQhX▒Х|T┐д ]цU▀Л▀E P▀MQhX▒ХhT┐д ]цU▀Л▀EPhX▒ХXT┐д]цU▀ЛhX▒ХLT┐д]цU▀ЛhX▒Х@T┐д]цU▀Л3ю]цU▀Л]цU▀Л▀EPhX▒Х$T┐д]цU▀ЛjХzЬЪЪ┐д3ю]цU▀Л┐Л ХT┐=X▒u0гEЬ┐} uhX▒h╪ХПS┐д┴EЬ┐}Ьt▀EЬИсгEЭ▀E ┴EТ┐}Т┤═▀MТЪ$█qh Ёh╡Х╧┐дh╠h╟Х╖┐дjХВЪЪ┐д┴EЭКjХ}S┘юt jХgВЪЪ┐д┴EЭКRХeS┘юt jХOВЪЪ┐д┴EЭК:jХ@ВЪЪ┐д┴EЭh╣h╢ХI┐дh╥h╤Х7┐дКгEЭЧЪЪЪ┐}Эt jшХS┐д╦▀Е]б ╧ЛU▀Л▀E;E s▀M┐9t▀UЪ▀E┐ю┴EКЮ]цллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллU▀ЛQ┴MЭ▀EP▀MЭ▀IХ⌠ЖЪЪ▀Е]бU▀ЛQ┴MЭj▀E P▀MЭ▀IХuЖЪЪP▀UR▀EЭ▀HХeЖЪЪPХФQ┐д ▀Е]бU▀Л┐Лp┴M═▀M═Х╕S┘юuИшjjХлQ┐д┴E╦┐}╦t▀E═▀HХ}ТЪЪP▀M╦ХВЪЪ┴E°КгE°▀M°┴MЭjjХ▒Q┐д┴E╢┐}╢t▀U═▀JХBТЪЪP▀M╢Х ТЪЪ┴E≤КгE≤▀E≤┴Eэ▀M═▀IХТЪЪP▀MэХЪСЪЪгEЮК ▀UЮ┐б┴UЮ▀E═▀HХЖСЪЪ9EЮ}@▀MЮQ▀UЮR▀E═▀HХ┼ВЪЪ┐юP▀MЮQ▀U═▀JХwВЪЪ┐юP█MюХFТЪЪ█EюP▀MэХЧСЪЪК╖▀MэQ█MДХ╞СЪЪ▀UэR█MтХ┬УЪЪ█EтP█MДQ▀MэХ.ТЪЪPХ╣P┐д гEЮК ▀UЮ┐б┴UЮ▀E═▀HХcСЪЪ9EЮ}<▀MЮQ▀MэХ╞УЪЪ▀P┴U╪▀E╪P▀M═▀IХiPP▀U╪R▀E═▀HХыЖЪЪP▀MЭХ▀УЪЪК╚▀Mэ┴M╛▀U╛┴U╟┐}╟tj▀E╟▀▀M╟Ъ┴E■КгE■▀E═▀H┴M╓▀U╓┴U╗┐}╗tj▀E╗▀▀M╗Ъ┴E░КгE░▀E═▀MЭ┴H▀Е]цU▀Л┐Л┴MПгEТ▀E %┘юt гEТК#▀M │А┘иt гEТК hЧЪм╚Х┤O┐д▀UR▀MХvQPХДO┐дгEЬ▀EП▀HХOРЪЪ9EЬ}L█MЭQ▀UЬR▀EП▀HХЦУЪЪ┐юP▀MХ1QPХ╔O┐д▀MЭ;MТu▀UЬR▀EП▀HХ┘OК ▀MЬ┐а┴MЬК╓▀UП▀JХgO▀Е]б U▀Л┐Л(jjjjjjhl█MэХ`OP█MЬХQO▀HQ▀R█EьP▀MХ8O▀хХ<РЪЪ▀Е]цU▀Л┐Л0█MЭХхТЪЪj█MэХ3Oj█MЛХ)O█EЭP█MэQ█MДХШРЪЪ▀PR▀P█MьQ▀MХХN▀R█EпP█MЛQ█MТХуРЪЪ▀хХФN▀PR▀P▀MХяN█MЭХбЯЪЪ▀Е]цU▀Л┐Л(▀E P█MьХбТЪЪ▀Q▀URjjjjjjhl█MэХ█NP█MЬХ~N▀хХ┴N▀E▀Е]цU▀Л┐Л┴MЛ█EПP▀MЛ▀IХ°O▀UЛ▀JХ▀O▀хХJРЪЪ┴EЭ█EЬP█MПQ▀MЭХ╧O▀UЬ┐Б ВзрR▀MЛХ╔СЪЪ▀Е]цU▀Л┐Л┴MЛ█EПP▀MЛ▀IХHO▀UЛ▀JХ7O▀хХЖЯЪЪ┴EЭ█EЬP█MПQ▀MЭХeOPХмM┐д▀UЬ┐БВзрR▀MЛХHСЪЪ▀Е]цU▀Л┐Л┴MЛ▀EЛ▀HХШN©х┴MЬ█UПR▀EЛ▀HХзN▀MЛ▀IХиN▀хХ┬ЯЪЪ┴EЭ┐}Ьtjj █UПR▀MЭХВNPХYM┐дКj j█EПP▀MЭХэNPХ>M┐дjj▀MЛХбПЪЪ▀Е]цU▀Л┐Л┴MЛ█EПP▀MЛ▀IХcN▀UЛ▀JХRN▀хХЯЪЪ┴EЭ█EЬP█MПQ▀MЭХtNPХХL┐д▀UЬВзрR▀MЛХfРЪЪ▀Е]цU▀Л│ЛЛ┴█ЧЪЪгEЭ▀E%П┐Ь └ ▀█ЧЪЪ▀IХN┴EЛ▀U│БП┘рu▀┘ЧЪЪ▀HХФM┴EПКi▀█ЧЪЪ▀IХсMP█∙╓ЧЪЪRХдОЪЪ┐д▀┴Eт▀█ЧЪЪ▀IХ╟MP█∙═ЧЪЪRХ║ОЪЪ┐д▀┴Eь▀█ЧЪЪ▀IХ█MP█∙°ЧЪЪRХ~ОЪЪ┐д▀┴Eэ█MЮQ▀∙ЧЪЪ▀JХNM▀E┐Ю┐Ь┘▀█ЧЪЪ┐y0u hЧЪм╚ХgK┐д▀∙ЧЪЪ▀J0┐аХОНЪЪ┘юu4█┘tЧЪЪP█MЮQ██|ЧЪЪХgM▀хХZMP▀∙ЧЪЪ▀J0┐аХ:НЪЪИ╖█┘LЧЪЪP█MЮQ██TЧЪЪХ3M▀хХ&M▀хХ⌠НЪЪ┘юu?██╢ЧЪЪХ╒НЪЪj█UЮR▀┘ЧЪЪ▀H0┐аQ██╢ЧЪЪХЛL██╢ЧЪЪХшLP█MЮХXKК@█∙$ЧЪЪR█EЮP██,ЧЪЪХлL▀хХ©LP▀█ЧЪЪ▀I0┐аХ╪НЪЪ┘юt hЧЪм╚ХwJ┐д█UЭ┴UХК]█EЮP▀█ЧЪЪ┐аХ┼ПЪЪ▀█ЧЪЪ┴A0▀∙ЧЪЪ▀B0г▀█ЧЪЪ▀Q0┴UХ▀E%П┐Ь u▀█ЧЪЪ▀Q0R▀█ЧЪЪХAНЪЪИ─▀EЛ%Ъ3и┐Ьd■а┴MЬ┐}Ьu▀U│БП┐Зu гEТК▀EЛ┴EТ▀M│АП┘иu)▀UХR▀EТP▀MПQ█UЮR▀█ЧЪЪ┐а ХдKPХJ┐дКA▀EтP▀MьQ▀UэR██╗ЧЪЪХ(J▀EХP▀MТQ█∙╗ЧЪЪR█EЮP▀█ЧЪЪ┐а Х{KPХвI┐д┐}Ьt▀M│АП┘иu ▀UХ▀ Х┘НЪЪ▀E┐Ю┐Ьut▀█ЧЪЪ▀Q0┐:u▀┘ЧЪЪ▀H0▀UЭ┴КV▀EЭP▀█ЧЪЪ▀Q0▀ ХъМЪЪ▀EЭ┴┘ЧЪЪ▀█ЧЪЪ┴█ ЧЪЪ┐╫ ЧЪЪtj▀∙ ЧЪЪ▀▀█ ЧЪЪЪ┴┘ЧЪЪК г┘ЧЪЪ▀M│АП┐Ыu▀UЛR▀┘ЧЪЪ▀H0▀ ХЛЪЪ▀∙ЧЪЪ▀B0P▀█ЧЪЪХ╪ЛЪЪ▀Е]бU▀Л┐Л┴MЬ▀EЬ┐x0u hЧЪм╚ХmH┐д▀MЬ▀IХ9J┴EЭ▀UЬ▀B0┐юP▀MЭQ▀UЬ┐б R▀EЬ▀H0▀ Х▓НЪЪ▀MЬХчЙЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ┐x0u hЧЪм╚ХH┐д▀MЭ▀Q0▀ ХЖIP▀MЭХЧМЪЪ▀Е]цU▀Л┐Л┴MП▀EП┐x0u hЧЪм╚ХшG┐д▀MП▀Q0R▀MП┐аХ╥КЪЪ┴EЭ▀EЭP▀MП┐аХoЙЪЪ▀┴MТ▀UТ┴UЬ┐}Ьtj▀MЬХЛЪЪ┴EЛКгEЛ▀EЭP▀MП┐аХ,H▀MП┐аХ КЪЪ┘юt!▀MП┐аХШЙЪЪ┐ХP▀MП┐аХЙЪЪ▀┴MХКгEХ▀UП▀EХ┴B0▀MП▀Q0R▀MПХ\КЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ▀HХСHP▀MЭ┐аХ╩ЛЪЪ▀MЭ┴A0jj▀MЭХКЪЪ▀Е]цU▀Л┐Л V┴MТгEЭгEЬ▀EТ┐x0u hЧЪм╚ХлF┐д┐}t▀MТ▀IХ▓H┴EЬ▀UТ▀JХ└H┴EЭ▀EТ▀H0▀▒┐б▀EТ▀H0┴▒▀UТ▀r0▀EТ▀H0▀ ХkH9├}6┐}t$▀UЬR▀EЭP▀MQ▀UТ┐б R▀EТ▀H0ХЛЪЪ┘юtК═jЪ▀MТХ@ЛЪЪК j▀MТХ4ЛЪЪ^▀Е]бU▀ЛQ┴MЭ▀EЭ┐x0u hЧЪм╚ХF┐д▀MЭ▀Q0г┌ЪЪЪЪjj▀MЭХЖИЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ┐x0u hЧЪм╚ХсE┐дj▀MЭХ░ХЪЪ┐юP▀MЭХ╫КЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ┐x0u hЧЪм╚Х°E┐д▀MЭ▀Q0┐бR▀MЭХlКЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ┐x0u hЧЪм╚ХiE┐дj▀MЭХ&ХЪЪ▀MЭ▀Q0┴┌jj▀MЭХIИЪЪ▀Е]цU▀Л┐Л┴MЬ▀EЬ┐x0u hЧЪм╚Х$E┐д▀MЬ▀IХПF┴EЭ▀UЭR▀EЬ▀H0▀ ХbХЪЪjj▀MЬХШХЪЪ▀Е]цU▀Л┐Л┴MЬ▀EЬ┐x0u hЧЪм╚ХжD┐д▀MQ▀MЬХ▒ГЪЪ┴EЭ▀UЭR▀EЬ▀H0ХШХЪЪ┐юP▀MЬХ▌ЙЪЪ▀Е]бU▀Л│Л┴█ПЧЪЪ▀┘ПЧЪЪ┐x0u hЧЪм╚Х~D┐д▀█ПЧЪЪ▀Q0┐бR██ЬЧЪЪХ╖ЙЪЪ▀EP▀█ПЧЪЪХГЪЪ┴┘ТЧЪЪ▀█ТЧЪЪQ▀∙ПЧЪЪ▀J0ХХЪЪ┐юP██ЬЧЪЪХчD█┘ЬЧЪЪP▀█ПЧЪЪХЩИЪЪ▀Е]бU▀Л┐Л ┴MТ▀EТ┐x0u hЧЪм╚ХЖC┐д▀MQ▀MТХ╠ФЪЪ┴EЬ▀UЬR▀EТ▀H0ХХЪЪ▀H┴MЭ┐} u▀UЭR▀MТХ╢ФЪЪК ▀EЭP▀MТХЪГЪЪ▀Е]бU▀Л┐Л0VW┴Mт▀Eт┐x0u hЧЪм╚Х▀C┐д▀Mт▀IХWE┴EЬ▀UR▀MтХ8ФЪЪ┴EЭ┐}Ьu/jjХpГЪЪ┐д┴EТ┐}Тt ▀MТХ√ИЪЪ┴EпКгEп▀Eп┴EЬ█MьQ▀UЭR▀Eт▀H0ХiГЪЪ▀х┐аХgC▀П╧▀}ЬС╔▀MЬQ▀MтХ.ГЪЪ_^▀Е]бU▀Л┐Л┴MЬ▀EЬ┐x0u hЧЪм╚ХщB┐д▀MQ▀MЬХ≤ЕЪЪ┴EЭ╧`─ХФЪЪP▀UЬ▀┌8P▀MЭQ▀UЬ▀J0ХМФЪЪ┐юP▀MЬХнЕЪЪ▀Е]бU▀Л┐Л┴MП▀EП┐x0u hЧЪм╚ХyB┐д▀MQ▀MПХ4ЕЪЪ┴EТ▀UТR▀EП▀H0Х·ФЪЪ▀H▀P ┴MЬ┴UЭ┐} u█EЬPХ ХЪЪ┐дP▀MПХ(ЕЪЪК!╧≤─ХЕЪЪP▀MП▀▒<R█EЬP▀MПХAЕЪЪ▀Е]бU▀Л┐Л┴MП▀EП┐x0u hЧЪм╚ХЛA┐д▀MQ▀MПХ╖ДЪЪ┴EТ▀UТR▀EП▀H0ХФЪЪ▀H▀P ┴MЬ┴UЭ┐} u█EЬPХuДЪЪ┐дP▀MПХ⌡ДЪЪК!╧╦─Х╗ДЪЪP▀MП▀▒@R█EЬP▀MПХ╢ДЪЪ▀Е]бU▀Л┐Л ┴MТ▀EТ┐x0u hЧЪм╚Х_A┐д▀MQ▀MТХДЪЪ┴EЬ▀UЬR▀EТ▀H0Х└ЕЪЪ▀┴MЭ┐} u▀UЭR▀MТХДЪЪК ▀EЭP▀MТХ,ФЪЪ▀Е]бU▀Л┐Л┴MЬ▀EЬ┐x0u hЧЪм╚ХВ@┐д▀MQ▀MЬХ╡ЦЪЪ┴EЭ▀UЭR▀EЬ▀H0ХЕЪЪ▀#M ВыиQ▀MЬХгФЪЪ▀Е]бU▀Л┐Л ┴MТ▀EТ┐x0u hЧЪм╚Х╒@┐д▀MТ▀IХbB©п┐Й┴UЬ▀EP▀MТХIЦЪЪ┴EЭ▀MЬQ▀UЭR▀EТ▀H0Х╞ДЪЪ▀хХ ФЪЪ▀Q▀MТХNЦЪЪ▀Е]бU▀Л┐Л┴MЬ▀EЬ┐x0u hЧЪм╚Х5@┐д▀MQ▀MЬХПБЪЪ┴EЭ▀UЬ┐б R▀EЭP▀MЬ▀I0ХVФЪЪP▀MЬХФЪЪ▀Е]бU▀Л│Л<┴█дЧЪЪ█EЬP▀█дЧЪЪ▀IХ÷A█UХR▀┘дЧЪЪ▀HХ█A█MПQ▀∙дЧЪЪ▀JХ{A██хЧЪЪХhЦЪЪ█EЬP█MХQ█UПR██хЧЪЪХ╧A██хЧЪЪХ╗AP▀█дЧЪЪХeЕЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХЦЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХ AP██ЮЧЪЪХ_A██ЮЧЪЪХNAP▀█тЧЪЪХ ЕЪЪ▀Е]цU▀Л│Л4┴█лЧЪЪ██ЮЧЪЪХбБЪЪjj█┘ьЧЪЪP▀█лЧЪЪ▀IХ╠@P██ЮЧЪЪХA█∙пЧЪЪR██ЮЧЪЪХ#AP▀█лЧЪЪХ╙ДЪЪ▀Е]цU▀Л│Л4┴█лЧЪЪ██ЮЧЪЪХaБЪЪjj█┘ьЧЪЪP▀█лЧЪЪ▀IХP@P██ЮЧЪЪХ╓@█∙пЧЪЪR██ЮЧЪЪХх@P▀█лЧЪЪХIДЪЪ▀Е]цU▀Л│Л4┴█лЧЪЪ██ЮЧЪЪХБЪЪjj█┘ьЧЪЪP▀█лЧЪЪ▀IХО?P██ЮЧЪЪХC@█∙пЧЪЪR██ЮЧЪЪХ7@P▀█лЧЪЪХХЦЪЪ▀Е]цU▀Л│Л4┴█лЧЪЪ██ЮЧЪЪХ÷АЪЪjj█┘ьЧЪЪP▀█лЧЪЪ▀IХ▌?P██ЮЧЪЪХБ?█∙пЧЪЪR██ЮЧЪЪХ @P▀█лЧЪЪХ┤ЦЪЪ▀Е]цU▀Л│Л4┴█лЧЪЪ██ЮЧЪЪХ>АЪЪjj█┘ьЧЪЪP▀█лЧЪЪ▀IХ-?P██ЮЧЪЪХ│?█∙пЧЪЪR██ЮЧЪЪХ╠?P▀█лЧЪЪХ&ЦЪЪ▀Е]цU▀Л│Л4┴█лЧЪЪ██ЮЧЪЪХщЮЪЪjj█┘ьЧЪЪP▀█лЧЪЪ▀IХл>P██ЮЧЪЪХ ?█∙пЧЪЪR██ЮЧЪЪХV?P▀█лЧЪЪХеБЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХ|ЮЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХk>P██ЮЧЪЪХ©>██ЮЧЪЪХ?P▀█тЧЪЪХDАЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХ"ЮЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХ>P██ЮЧЪЪХe>██ЮЧЪЪХ╝>P▀█тЧЪЪХЙЮЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХхъЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХ╥=P██ЮЧЪЪХ >██ЮЧЪЪХZ>P▀█тЧЪЪХ░ЮЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХnъЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХ]=P██ЮЧЪЪХ╠=██ЮЧЪЪХ>P▀█тЧЪЪХ6ЮЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХъЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХ=P██ЮЧЪЪХW=██ЮЧЪЪХ╡=P▀█тЧЪЪХэъЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХ╨чЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХ╘<P██ЮЧЪЪХЩ<██ЮЧЪЪХ^=P▀█тЧЪЪХ┌ъЪЪ▀Е]цU▀Л│Л,┴█тЧЪЪ██ЮЧЪЪХ`чЪЪjj█┘ьЧЪЪP▀█тЧЪЪ▀IХO<P██ЮЧЪЪХё<██ЮЧЪЪХ =██ЮЧЪЪХ┤<P▀█тЧЪЪХDЮЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ▀HХ#<P▀MЭХSъЪЪ▀Е]цU▀ЛQ┴MЭ▀EЭ▀HХ<P▀MЭХqчЪЪ▀Е]цU▀Л┐Л┴MП▀EП▀┬D┴MЭ▀UП▀┌H┴EЬ▀MП▀▒L┴UТ▀MПХ─эЪЪ▀MПХ▐чЪЪ▀EП▀MЭ┴┬D▀UП▀EЬ┴┌H▀MП▀UТ┴▒L▀Е]цU▀Л┐Л┴MП▀EП▀HХ~;┴EЭ┐}Эu hЧЪм╚Х▒9┐д╧`─ХфэЪЪP▀MП▀▒8R▀EЭP█MТХК9P▀MПХ≈эЪЪ▀Е]цU▀Л┐Л┴MП▀EП▀HХ&;┴EЭ╧≤─Х"эЪЪP▀MП▀▒<R▀EЭP█MТQХэЪЪ┐дP▀MПХNэЪЪ▀Е]цU▀Л┐Л$┴Mэ▀Eэ▀HХщ:┴EЭj█MЛХ▄9╧╦─ХЭшЪЪP▀Mэ▀▒@R▀EЭP█MХХ║чЪЪ▀Q█UЮR█EЛP█MТХ:щЪЪ▀хХ{9P▀MэХЕшЪЪ▀Е]цU▀Л┐Л┴MХ█EЬP▀MХ▀IХX:▀UХ▀JХe:┴EТ┐}Тu hЧЪм╚Хx8┐д█EЬPj▀MТQ█MЛХА8P▀MХХ█шЪЪ▀Е]цU▀Л┐Л┴MХ█EЬP▀MХ▀IХ:▀UХ▀JХ :┴EТ█EЬPj▀MТQ█UЛRХшЪЪ┐дP▀MХХDшЪЪ▀Е]цU▀Л┐Л,┴Mт█EТP▀Mт▀IХ╥9▀Uт▀JХд9┴EЭj█MДХs8█EТPj▀MЭQ█MЮХ≈щЪЪ▀R█EьP█MДQ█MЛХ0эЪЪ▀хХq8P▀MтХшзЪЪ▀Е]цU▀Л┐Л┴MП█EЬP▀MП▀IХN9▀U▀┴EТ▀MТQХXшЪЪ┐д▀Uг█MЬХшЪЪ┘юt$█MЬХВзЪЪPХ!8┐д▀M┴█UЬR▀E▀Х8▀Е]бU▀Л┐Л ┴MЬ▀EЬ▀HХС8©х▀UЬ┴┼H▀EЬ▀HХэ8©х▀UЬ┴┼D▀EЬ│╦DЪЪЪ|▀MЬ│╧DЪ~ hЧЪм╚Хз6┐д▀UЬ┐╨HЧ|▀EЬ│╦HЪ~ hЧЪм╚Х╡6┐д▀MЬ┐╧D}#▀UЬ▀┌DВь▀MЬ┴│D▀UЬг┌LК ▀EЬг─L▀MЬ▀▒H┴UТ┐}ТЧt&┐}ТtК=▀MЬ┐а4Х┐эЪЪ┘юu▀EЬг─HЪЪЪЪК█MЭQ▀MЬ┐а4ХwзЪЪ▀хХ шЪЪ▀UЬ┴┌H▀Е]цU▀Л┐Л┴MЬгEЭ▀EЭ▀MЭ┐И┴MЭ┘юt▀UЭ▀EЬ█▄░PQ▀MЬХКзЪЪКь▀Е]цU▀ЛQ┴MЭj▀MЭХбьЪЪ▀Е]цU▀Л┐Л┴MЬ┐}u;▀EЬ▀H0┐╧Ъu▀UЬ▀B0▀┬┐а▀UЬ▀B0┴┬▀MЬ▀Q0▀┌┴EЭК▀MЬ▀IХ@7©п┐Й┴UЭ┐}Э|▀EЬ▀H0▀ ХH7┐Х9EЭ~ hЧЪм╚ХD5┐д▀EЭ▀Е]бU▀Л│Лd┴█°ЧЪЪ██эЧЪЪХ╗шЪЪ█MДХзЪЪ██тЧЪЪХО5▀┘°ЧЪЪ┐╦L└ │}═|\▀█°ЧЪЪ┐╧Xt▀∙°ЧЪЪ▀┌XP██тЧЪЪХj5Кh ░██лЧЪЪХn4P██тЧЪЪХL5▀E≥│БЪЪбаЬ┴EИ╖│}'|Y▀█°ЧЪЪ┐╧Tt▀∙°ЧЪЪ▀┌TP██тЧЪЪХ5Кh░██дЧЪЪХ 4P██тЧЪЪХГ4▀E≥│БЪбаЬ ┴EКE▀█°ЧЪЪ┐╧Pt▀∙°ЧЪЪ▀┌PP██тЧЪЪХ╛4Кhd▒██╪ЧЪЪХ╟3P██тЧЪЪХ▌4▀█°ЧЪЪ┐╧H~h│}Г~_▀E≥╧ХВЫR▀∙°ЧЪЪ▀┌HPh░██╟ЧЪЪХc3Q▀лPХхыЪЪ█MДQХw4┐д█UДRj██эЧЪЪХ]4▀E≥╧ХВЫ┴EК≤▀URh░██╓ЧЪЪХ3Q▀лPХ~ыЪЪ█EДPХ-4┐д █MДQj██эЧЪЪХ4██тЧЪЪХлжЪЪ┘юt█∙тЧЪЪR██эЧЪЪХн3██эЧЪЪХ╚жЪЪ▀█°ЧЪЪ;│D}7█∙эЧЪЪR█MДХежЪЪQ▀лj ХxьЪЪj▀┘°ЧЪЪ▀┬DQ█UДR██эЧЪЪХ°3█┘эЧЪЪP▀█°ЧЪЪХ²ьЪЪ▀Е]бU▀Л│Л└┴█┬ЧЪЪ██ЬЧЪЪХ"ыЪЪ▀┘┬ЧЪЪ┐╦4┘┴h ░██тЧЪЪХ-2P██ЬЧЪЪХёьЪЪ▀M┐А┘иtj██ЬЧЪЪХвЪЪфr▀U┐Б┘рtj██ЬЧЪЪХвЪЪфh▀E┐Ю┘юtj██ЬЧЪЪХФжЪЪфs▀M┐А ┘иtj██ЬЧЪЪХлжЪЪфaИ*▀∙┬ЧЪЪ▀┌4P██ПЧЪЪХ82Q▀лj%ХjвЪЪ██ПЧЪЪХя2┴┘ЛЧЪЪ┐╫ЛЧЪЪЪ└ь▀█ЛЧЪЪQ█∙хЧЪЪR██ПЧЪЪХ÷2P██ЬЧЪЪХK2▀┘ЛЧЪЪ┐ю┴┘ЛЧЪЪ▀█ЛЧЪЪQ██ПЧЪЪХЧтЪЪ3р┼R██ХЧЪЪХЖжЪЪ▀┘ЛЧЪЪ┐юP██юЧЪЪQ██ПЧЪЪХ@2P██ПЧЪЪХЮ1██ХЧЪЪХжЪЪ┐Ь%uQ▀лj%Х╢жЪЪ██ЬЧЪЪХ 2И+Q▀лj%Х жЪЪ██ПЧЪЪХ2┴┘ЛЧЪЪ┐╫ЛЧЪЪЪu hЧЪм╚ХФ0┐д▀∙ЛЧЪЪR█┘эЧЪЪP██ПЧЪЪХф1▀█ЛЧЪЪ┐аQ█∙╟ЧЪЪR██ПЧЪЪХ╓1P██ПЧЪЪХD1г┘ДЧЪЪ██ХЧЪЪХw1┴┘└ЧЪЪ▀┘└ЧЪЪ┐Хa┴┘└ЧЪЪ┐╫└ЧЪЪw]▀∙└ЧЪЪ3и┼┼й>Ъ$█╝>г┘ДЧЪЪКIг┘ДЧЪЪК=г┘ДЧЪЪК1г┘ДЧЪЪ К%г┘ДЧЪЪКг┘ДЧЪЪК hЧЪм╚Х0┐д██эЧЪЪХ√сЪЪ┘ю└╣Q▀лj:ХxуЪЪ██эЧЪЪХъ0┴┘ЛЧЪЪ┐╫ЛЧЪЪЪtp▀E#┘ДЧЪЪ┘юt!▀█ЛЧЪЪQ█∙═ЧЪЪR██эЧЪЪХ╓0┴┘─ЧЪЪК"▀┘ЛЧЪЪ┐юP██≤ЧЪЪQ██эЧЪЪХz0┴┘─ЧЪЪ▀∙─ЧЪЪ┴∙╗ЧЪЪ▀┘╗ЧЪЪP██ЬЧЪЪХ0К▀M#█ДЧЪЪ┘иt█∙эЧЪЪR██ЬЧЪЪХС/КT▀E#┘ДЧЪЪ┘юt██ХЧЪЪ┴█|ЧЪЪКj ██▄ЧЪЪХ╔тЪЪ┴┘|ЧЪЪ▀∙|ЧЪЪ┴∙░ЧЪЪQ▀л▀┘░ЧЪЪPХбрЪЪ██ЬЧЪЪХы/ИЩЪЪ██ПЧЪЪQ██ЬЧЪЪХ├/█∙ЬЧЪЪR▀█┬ЧЪЪХ╔тЪЪ▀Е]б2=J===&=>=V=U▀Л│ЛP┴█╟ЩЪЪ██ЬЧЪЪХЬтЪЪ██ЛЩЪЪХМтЪЪ┐} t▀E P██ЛЩЪЪХ┬тЪЪК▀MQ██ЛЩЪЪХwтЪЪh(░██ЮЩЪЪХЕ-P██ЛЩЪЪХ;/┴┘ТЧЪЪ┐╫ТЧЪЪЪu$h,░██ьЩЪЪХ╨-P██ЛЩЪЪХ/┴┘ТЧЪЪК+▀█╟ЩЪЪ┐а4ХТ.▀█╟ЩЪЪ┐а4ХПяЪЪ┐Ьu г┘ТЧЪЪЪЪЪЪ┐╫ТЧЪЪЪtY█∙╪ЩЪЪR▀MХЫ-▀хХ+рЪЪ≥╧ ВЫ┴∙ХЩЪЪ┐╫ХЩЪЪt,┐╫ХЩЪЪ }#h0░██╢ЩЪЪХ,-P▀∙ТЧЪЪR██ЛЩЪЪХ9.█┘ЛЩЪЪP██ЬЧЪЪQ▀MХY.█∙ЬЧЪЪR▀█╟ЩЪЪХсЪЪ▀Е]б U▀Л┐Л┴MЬ▀EP▀MЬХ /▀MЬ┐а Х┤пЪЪ▀MЬ┐аХlяЪЪ▀MЬ┐а4Х.▀MЬг│█UЭR▀MЬ┐а4Х0яЪЪ▀хХдяЪЪ▀MЬ┴│H▀EЬ▀Е]бU▀Л┐Л jh\ХД,┐д┴EЬ┐}Ьt▀EP▀MЬХ╒пЪЪ┴EТКгEТ▀MТ┴MЭ▀UЭRХЁ-┐д▀MЭХ╙оЪЪ▀EЭ▀Е]цU▀ЛQ┴MЭj▀MЭ┐а ХШ.PХм,┐дj▀MЭ┐аХ╘яЪЪ▀Е]цU▀Л┐Л┴MД▀EДг│▀MД┐а Х\-▀MД┐аХ©пЪЪ▀MД▀▒4┴UЬ▀EЬPХГоЪЪ┐д▀MД▀▒8┴UТ▀EТPХооЪЪ┐д▀MД▀▒<┴UП▀EПPХ╥оЪЪ┐д▀MД▀▒@┴UЛ▀EЛPХ÷оЪЪ┐дгEЭК▀MЭ▀UД▀└┼P┴EХ▀MХQХzоЪЪ┐д▀UЭ▀EЭ┐Х┴EЭ┘рtКрХынЪЪ▀MД┐аХснЪЪ▀MДХ%оЪЪ▀Е]цU▀Л┐Л┴MЭ▀E┴EЬ│}Ьх*│}Ьх└D▀MЬ┐Иd┴MЬ┐}Ь┤┴▀UЬЪ$∙пH│}Ь,,│}Ь,└▀EЬ-и┴EЬ┐}Ь┤T▀MЬЪ$█ЮH│}ЬТ5│}ЬТ└▀UЬ│Й-┴UЬ┐}Ьp┤▀MЬ3ю┼│JЪ$┘@I│}Ь&-│}Ь&└<▀UЬ│ЙУ┴UЬ┐}Ь┤Ю▀EЬЪ$┘│J│}Ь'-│}Ь'└╤▀MЬ│И'┴MЬ┐}Ь┤╙▀UЬЪ$∙║JИ⌡▀MЭХZпЪЪИ⌡▀MЭХепЪЪИ▌▀MЭХьнЪЪИ│▀MЭХ²оЪЪИtj ▀MЭХ оЪЪИej▀MЭХоЪЪИVj▀MЭХоЪЪИGj▀MЭХСнЪЪИ8h▀MЭХАнЪЪИ&h▀MЭХонЪЪИh▀MЭХ╫нЪЪИ▀MЭХпЪЪИУ▀MЭХxлЪЪИХ▀MЭХ▀оЪЪИшj▀MЭХVмЪЪИлj▀MЭХGмЪЪИ╫j▀MЭХ8мЪЪИ╝▀MЭХПкЪЪИ║▀MЭХБлЪЪИ■▀MЭХ╣нЪЪИ┤▀MЭХ┌лЪЪИz▀MЭХQмЪЪИm▀MЭХOлЪЪИ`j▀MЭХ√кЪЪИQj▀MЭХ,лЪЪИBjj▀MЭХимЪЪИ1j▀MЭХ'оЪЪИ"jj▀MЭХYмЪЪИjj▀MЭХбкЪЪИjj▀MЭХ9кЪЪИОjj▀MЭХоЪЪИчjj▀MЭХЪнЪЪИмjj▀MЭХНнЪЪИ╪j j▀MЭХщнЪЪИ╚jj▀MЭХлнЪЪИ j▀MЭХ≤кЪЪИ▀j▀MЭХ^нЪЪИ|j▀MЭХ╡йЪЪИmj▀MЭХHкЪЪИ^jj▀MЭХЕлЪЪИMj▀MЭХCнЪЪИ>jj▀MЭХuлЪЪИ-jj▀MЭХчйЪЪИjj▀MЭХUйЪЪИ jj▀MЭХ,нЪЪИЗjj▀MЭХнЪЪИИjj▀MЭХ нЪЪИьj j▀MЭХЫмЪЪИгjj▀MЭХХмЪЪИ╤j▀MЭХ╢йЪЪИ╖j▀MЭХzмЪЪИ≤▀MЭХ"мЪЪИ▀▀MЭХбйЪЪИ~▀MЭХЦиЪЪИq▀MЭХЯлЪЪИd▀MЭХfмЪЪИW▀MЭХЬиЪЪИJ▀MЭХ*лЪЪИ=▀MЭХ°йЪЪИ0▀MЭХ7мЪЪИ#▀MЭХ├кЪЪИ▀MЭХbиЪЪИ ▀MЭХшйЪЪИЭ▀MЭХhлЪЪИО▀MЭХ▐йЪЪИБjj▀MЭХiкЪЪИяj▀MЭХkиЪЪИбjj▀MЭХЫйЪЪИ╠jj▀MЭХbиЪЪИ═jj▀MЭХыхЪЪИ▐jj▀MЭХкЪЪИ~j▀MЭХиЪЪИojj▀MЭХ╕йЪЪИ^jj▀MЭХиЪЪИMjj▀MЭХ├хЪЪИ<▀MЭХ▐кЪЪИ/▀MЭХtйЪЪИ"▀MЭХЩйЪЪИ▀MЭХ7йЪЪИ▀MЭХ╕кЪЪИШ▀MЭХsиЪЪИН▀MЭХ┌кЪЪИА▀MЭХWкЪЪИт▀MЭХхЪЪИг▀EЭ4P▀MЭХ]йЪЪjj▀MЭХMиЪЪИ╔▀MЭ│а8Q▀MЭХ:йЪЪjj▀MЭХ*иЪЪИ┌▀UЭ│б<R▀MЭХйЪЪjj▀MЭХиЪЪКb▀EЭ@P▀MЭХЬиЪЪjj▀MЭХХхЪЪКC▀MЭХqгЪЪjj▀MЭХрхЪЪК-▀MЭХ^иЪЪjj▀MЭХ╪хЪЪК▀MЭХWиЪЪК h┘Ъм╚Х║$┐д▀Е]б"C/C2%-B%:0%J%:1%T%:2%S%:3%+B %D%M%*Y%/0%1%/1%2%/2%3%/3%D%M%*Y%/0%1%/1%2%/2%3%/3%-B%:0%J%:1%T%:2%S%:3%+B═≥:╗o╒oWоХ^CЕёб▐·╧≈YA═┌≤┌═┌═┌i,AldurFile.opxSTARTUPMK%c%03d%d %J%I0║Ь╔ьёп╒╕╓╔P═ ╕$ё8─c─│─2── ─e─h─╤─ ─3─╕─B─H─г─╗──╠─Q─(─d─V─Y─5─┌─l─9─┐─$─j─┘─╘──╜─G──+─e─╟─$──┐─░──1─ч─%─⌡─_──■──▓─У─╜─╩─и─╛─(──y─╫─⌡─n─а─w─°─k─#─:─6─D─\─<─=─╩─h──╨─f─g──Г─╬─ ──▒─z─G─`─w─_─О─ь─╓─╝─©─R─M─+─╗─@─÷─╕─╔─ё─╒─║─═─&─┌─{─▓─й── ─b──c─a─W─V─`─\──8─c─│─2── ─e─h─╤─ ─3─╕─B─H─г─╗──╠─Q─(─d─V─Y─5─┌─l─9─┐─$─j─┘─╘──╜─G──+─e─╟─$──┐─░──1─ч─%─⌡─_──■──▓─У─╜─╩─и─╛─(──y─╫─⌡─n─а─w─°─k─#─:─6─D─\─<─=─╩─h──╨─f─g──Г─╬─ ──▒─z─G─`─w─_─О─ь─╓─╝─©─R─M─+─╗─@─÷─╕─╔─ё─╒─║─═─&─┌─{─▓─й── ─b──c─a─W─V─`─\──EUSER.DLLOPLR.DLLEFSRV.DLLy]Н⌡<+8⌠8╔8©8ы8О89959a9v9{9╣9╨9©9л9я9*:/:<:A:q:u:y:}: ·::;г;04ш3 4s4ё89a9╝9Ь9Д:= =╝>╡>╤>╨>╬>б>ф>,?W?Е?@тp0/1:2o2╕2╜2Ц23п8т8ь8э8Ю8Д8Х8Л8П8Т8Ь8Э8999 99999 9$9(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|9─9└9┬9▄9░9■9≤9°9═9╓9╗9╛9╟9╢9╦9╪9ю9д9х9л9п9т9ь9э9Ю9Д9Х9Л9П9Т9Ь9Э9::: :│:┘:┴:█:▒:∙:≥:²:║:╔:╘:╜:╠:P=;};>`Ф1▄6²6<7M7л8щ8<;~;╪;╬<="=(=.=4=:=@=F=L=R=X=^=d=j=p=v=|=┌=┬=▌=■= =═=╕=╛=╡=╦=╬=д=й=п=ж=э=Б=Х=Н=Т=З=>> >>>>$>*>0>6><>B>H>N>T>Z>`>f>l>r>x>~>└>┼>░>√>°>╒>╗>╝>╢>╨>ю>ф>л>р>ь>ч>Д>Й>П>Ж>Э>????? ?&?,?2?8?>?D?J?P?V?\?b?h?n?t?z?─?├?▄?▓?≤?·?╓?╙?╟?╤?╪?б?х?н?т?з?Ю?Ф?Л?Р?Ь?Ч?p 0─(Ь0Э011 111 1(1,1014181<1@1D1\EPOC32\RELEASE\WINS\DEB\Z\system\opx\AldurFile.opxNB10шy[>лS:\EPOC32\RELEASE\WINS\DEB\AldurFile.pdb