ChronoSync 4.9.5 軟體資訊交流 Mac

winXmac軟體社群 Mac 壓縮備份 Econ Technologies, Inc. 未分類 Rate 100

ChronoSync for Mac,軟體教學,軟體下載,軟體社群,Windows軟體,Mac軟體

ChronoSync 4.9.5 Mac


ChronoSync 是同步,備份,可啟動備份和雲存儲的主要 Mac 應用程序。它是一個完整的一體化解決方案 - 沒有其他應用可以比較!

ChronoSync for Mac 是定期備份,可啟動驅動器克隆和文件夾同步的專業選擇。定位在 Finder 中可見的任何設備或文件夾,例如音量,拇指驅動器,NAS,磁盤映像,服務器或(使用 ChronoAgent)另一台 Mac!通過 ChronoSync 4.7,您可以直接連接到 Amazon S3 和 Google 雲存儲雲服務以及 SFTP 文件服務器。 ChronoSync 使用一個功能強大的應用程序替代了您的備份實用程序,驅動器克隆實用程序和文件夾同步實用程序。使用 ChronoMonitor 獲取發送到手機的同步推送通知。添加 InterConneX(iOS 版免費)並使用 ChronoSync 將文件和文件夾推送到您的 iDevice!

ChronoSync for Mac 功能:

文件和文件夾同步
同步使兩組文件彼此相同。典型的例子是當你在辦公室裡有一台台式電腦和一台筆記本電腦的時候。您將在出發前和當您返回時再次同步您的文件。 ChronoSync 擅長此任務!

保護您的珍貴數據
A 備份創建您的文件的冗余副本,以防止數據丟失。備份到外部硬盤驅動器和歸檔舊數據是必須的。為了增加冗餘,備份到遠程設備甚至是雲。 ChronoSync for Mac 可以處理所有這些和更多!

快速從災難中恢復
可啟動備份是啟動驅動器的克隆。它允許你啟動你的 Mac,並立即恢復工作,如果你的主驅動器出現故障 - 不要急於嘗試恢復備份的數據。 ChronoSync 可以輕鬆處理可啟動的備份!

Works 當您離開時
強大的調度功能使您可以安排任何同步或備份,幾乎可以在您想像的任何時間間隔運行。在您未使用計算機或正忙於使用其他應用程序時運行任務。它的“計時器”(Chrono)在 ChronoSync 的名字!

靈活性和控制在你的指尖
ChronoSync 提供了深入到你的文件夾樹和精確控制將發生什麼的能力。為了安心,預覽到底發生了什麼事情 - 所以你可以在提交之前進行修改。沒有其他工具可以提供這樣的互動水平!

堅持支付的投資
ChronoSync 由一個專門的團隊積極開發和維護 - 不像一些競爭的應用程序,當然可以被視為“棄用”。自 2002 年以來,我們已經更新了 70 多次,每年至少有一次主要更新 - 而且從來沒有升級費用!而其他公司則只是將產品保留在最新版本的 macOS 上,我們努力保持最新的技術和趨勢。除非 ChronoSync for Mac 越來越好,否則我們不開心!

注意:15 天試用版。需要 64 位處理器.

檔案版本 ChronoSync 4.9.5
檔案名稱 CS4_Download.dmg
檔案大小 67 MB
系統 Mac OS X 10.10 or later
軟體類型 未分類
作者 Econ Technologies, Inc.
更新日期 https://www.econtechnologies.com/chronosync/overview.html
軟體類型 2019-10-10
更新日誌

What's new in this version:

ChronoSync 4.9.5
Changes and enhancements:
- Added support for Archiving over Backblaze B2 connections
- Added support for identifying and managing APFS Volume Groups
- Added support for properly handling firmlinks in Bootable Backup
- Added support for APFS Volume Groups to the Bootable Backup Assistant
- Added the Compound Volume Group readiness check to ensure that a destination volume is constructed properly for Catalina bootable backups
- Implemented the all-new Volume Group Converter utility that allows a single APFS volume to be converted to an APFS Volume Group on macOS Catalina. This utility activates when the user attempts to 'fix' the readiness warning
- The Bootable Backup Assistant now presents the option of creating a sibling APFS volume. To get this option, you must select an existing APFS volume as your destination. When presented with formatting/erase options for that volume, you'll now have the option to create a sibling volume. This will create an all new volume in the same container as the destination volume you selected
- The Bootable Backup Assistant now enforces unique volume names when naming your destination volume (either after choosing to erase it or to create a sibling volume).The restriction is such that you cannot choose a name that already exists in your destination APFS container, unless you are erasing an existing volume and keeping the same name. Note that duplicate volume names are allowed, just not in the same APFS container
- The Bootable Backup Assistant now makes sure that Preboot and Recovery volumes are dereferenced when deleting or erasing existing APFS volumes
- The Bootable Backup Assistant now creates a bootable sync task that has Aggressive Smart Scan enabled on the destination
- The Bootable Backup assistant will now append "Not recommended" to the "Proceed as-is" formatting option if a) the source and destination are APFS volumes AND b) they have mismatched crypto users as a crypto user mismatch is likely to produce errors from the UpdatePreboot utility
- Implemented logic whereby sync task targets configured on pre-Catalina systems will automatically update the VolumeSpecifier object (if necessary) after being opened for the first time after a Catalina upgrade
- Now attempts to suspend Spotlight operation on Admin Access Volumes
- Improved volume detection and mounting efficiency
- Modified Full Disk Access detection logic for macOS 10.15 (Catalina)

Converted to using bookmark objects instead of alias objects to track the location of various files and folders. This affects the location of:
- The main 'Tasks' (aka 'Sync Documents') folder
- Any sync task ever opened by ChronoSync and tracked in the Organizer
- A scheduled item's reference to the sync task that is scheduled
- A container sync task's reference to all contained sync tasks
- A sync (and container sync) task's reference to pre- and -post- sync scripts
- Any File Comparison Helper's reference to the helper application
- Improved the Readiness Manager efficiency by caching commonly used sync task properties when evaluating all readiness tests
- The Resolve Alias and Freeze Filesystem readiness warning is no longer generated if the target file manager is not running with root privileges because a snapshot will not be taken unless you're running with root privileges
- The 'Aggressive' SmartScan mode now functions as it was originally intended by turning off self-audits. Previously, all this setting did was reduce the frequency of self-audits
- All assistants that create uni-directional sync tasks with SmartScan enabled will now enable Aggressive Mode on the destination target
- The Delete Action UI presented from Analyze when manually deleting files now displays the "Deletion is permanent" warning using the OS's secondary label color instead of disabled text color
- If the application is instructed to terminate due to a system shutdown or restart, and there are currently scheduled syncs running, the warning dialog that tells the user about the running sync will auto-dismiss after 10 seconds. If this happens, the app will behave as if the user instructed the dialog to abort all syncs and terminate. If the user interacts with the dialog within the 10 second window, system shutdown/restart can be cancelled
- On application termination, will now shut down any active Bonjour service listeners before quitting
- Retrieval of a graphic resource when displaying an update notice is now performed asynchronously in a background thread to avoid the potential of a rather long block before the update notice was displayed
- When selecting a target, a new VolumeSpecifier object is now always created even if the new target resides on the same volume as the previous target to prevent potential problems whereby not all properties of the volume are collected, and some of those properties may have changed since the target was last specified
- Optimized the mount detection logic for non-local volumes for ChronoAgent-connected targets for which we have valid device information and a device GUID
- SmartScan query reset log messages will now indicate the name of the volume where the reset occurred
- File system freezing log messages now indicate the volume name which contains the frozen filesystem
- Disabled self-validation when creating alias objects
- The "/Cores" folder is no longer part of the bootable backup blacklist
- The "/Volumes" folder has been added to the auto-exclusion blacklist
- Eliminated the use of deprecated APIs when attempting to move items to the trash
- Copying and/or deleting dylib files in the /Users domain will no longer trigger the execution of update_dyld_shared_cache at the end of a bootable backup synchronization

Bug Fixes:
- Fixed a bug in the False Mount Point Detection Readiness Test that could lead to erroneous false-mount-point warnings when the real problem was that the target was not connected
- Fixed a bug in the Validator whereby validating the root level of a volume could introduce an error and premature termination of the validation process
- Fixed a bug in the SFTP storage provider whereby it was assumed that an SFTP server would always provide a list of valid authentication methods which could cause a crash
- Fixed a bug whereby if the user had selected a file-pair in Analyze and the program was in the midst of fetching file information as a result, and the user then switched back to Setup and selected a different file manager, the program could crash when trying to display the results of the file information fetch that was still pending
- Fixed a bug whereby attempting to create the parent path of a nested item which had no parent that could result in unexpectedly synchronizing all files or creating a new destination folder outside of the sync tree
- Fixed a bug whereby entering a blank value in the "Max retry attempts" field (when scheduling tasks) would raise an exception
- Fixed a bug whereby when executing external tasks, an overflow of the error stream's pipe buffer would cause a long stall and slow execution of the task. This was most evident when running update_dyld_shared_cache during the "Optimizing" phase of a bootable backup. A stall would occur if that task generated a lot of error output
- Fixed a bug whereby the Resource Fork Unsupported Readiness Test would generate a warning even if the sync task had 'preserve resource forks' set to NO
- Fixed a bug whereby the Full Disk Access Readiness Test could erroneously report that full disk access was required on the right target, if it needed testing
- Fixed a bug whereby the partition scheme readiness test would sometimes be performed when a target volume was not mounted, resulting in an erroneous warning about the partition scheme
- Fixed a bug whereby the VolumeSpecifier might not perform its final, 'forced' attempt to unmount a volume if the standard efforts to unmount the volume failed
- Fixed a bug whereby the Bootable Backup Assistant would indicate that an HFS+ filesystem must be selected even though there were APFS options presented
- Fixed some bugs in the archive management logic whereby assumptions were being made about the location of the sync task archive that could cause some features to break if the archive were located anywhere but at the root level of the corresponding target
- Fixed a bug whereby the archiving logic would produce an error if the archive data structure became out-of-sync with the filesystem with regards to a package becoming a folder. It now self heals if an attempt is made to archive a file that resides within a package rather than the package as a whole. This sort of problem was possible when enabling dissect packages on a sync task that was previously run with standard/merge package handling
- When calling update_dyld_shared_cache as part of the 'Optimizing' phase of a bootable backup, some newly added arguments will not be passed to the utility on pre-10.14 systems since older OS's don't appear to handle them properly
- Fixed a bug in the Sync Task Document Window Controller whereby a UI change was being performed in a background thread
- Fixed a bug whereby inconsistent information could be returned about mounted disk images, causing a sync task target to lose information necessary to mount the disk image
- Fixed a bug whereby the test to see if a sync target's volume contained a bootable operating system was being performed on a file server connection. This was always destined to fail
- Fixed a bug whereby when un-registering with the push notification server, we now properly re-establish hardware identity properties to prevent a reset from continuing to occur every time a push notification is sent


ChronoSync 4.9.4
Changes and enhancements:
- Changed Strict Volume Identification to no longer examine deviceModel and deviceProtocol
- Implemented full Diagnostic Logging support in the InterConneX connections

Bug Fixes:
- Fixed a bug when communicating with an InterConneX sharespace as a target whereby it was not likely going to be able to copy into a locked folder
- Fixed a bug whereby if invoking a Trial Sync and target validation fails, subsequent attempts to invoke a standard sync (after correcting the cause of the validation failure) would invoke Trial Sync again unexpectedly
- Fixed a few diagnostic messages that were being generated in non-debug builds
- Fixed the logic used to determine a unique, temporary file name for copying to a remote cloud or InterConneX target as it had concurrence issues and could return non-unique filenames if called simultaneously from different threads
- Fixed a bug whereby setting the UF_HIDDEN, UF_IMMUTABLE and UF_APPEND BSD flags on a file stored in an InterConneX target was prone to setting random values for those flags
- Fixed a bug whereby extracting a file path from a collection record could result in a corrupt path. This could lead to errors or even a crash
- Fixed a bug whereby the read-only destination readiness test would report "Left target is read-only" when BOTH targets were read-only, even though it was a left-to-right sync


ChronoSync 4.9.3
Enhancements and Changes:
- Changed the algorithm for determining temporary file names to be less prone to natural filename collisions during concurrent copying tasks.
Now handles any exceptions when obtaining attributes from an SFTP directory entry and treats this condition as a non-directory entry (i.e. it just skips it)
- When a comparison helper is called, the sync target's file manager is now used to obtain information about the files being compared
- Now validates any relative alias object created and compares it against the original item to catch potential mismatches
- Now only replacing the reference to the task document when modifying a scheduled item if it has actually changed
- Improved memory management in the Backblaze B2 storage provider
- Added logic to the sync task document loader so that it can better deal with potentially damaged task documents
- Significantly reduced the size of the scheduler database and the overhead of loading/saving it
- More efficiently instantiate scheduled items from the scheduled items database to handle potentially corrupt elements
- Modified how the scheduled item database gets saved so that multiple changes made in quick succession are coalesced before saving
- Reduced app activation overhead by no longer reconstructing the Templates contextual menu on every activation of the app
- Updated the Trial Sync results window to clean up a path to an item before passing that off to a helper tool or external service such a 'Get Info in Finder' to ensure that the path represents the file object on the real target and not a snapshotted version of it
- Now performs a sync history reset (retaining exclusions) after changing Package Handling, Sync Operation, and Sync Triggers on a previously synchronized task document to ensure all appropriate information gets collected and items are handled correctly on the next run
- Changed the terminology used to identify Backblaze B2 application keys & account IDs to match the latest B2 terminology and to be consistent (i.e. English) across all languages
- All the cloud service connection profile editors have had their authentication's credential fields set to character-wrap instead of word-wrap.
Added logic that ensures any excluded file-pair does not have any other status set

Bug Fixes:
- Fixed a bug whereby the pre-defined AWS S3 endpoint strings were inadvertently translated in non-English languages
- The ChronoAgentLocal-Console.log file is now being rolled-over automatically
- Fixed some auto-layout problems in the AWS and Backblaze B2 connection profile editors
- Fixed some bugs whereby many commands were not properly setting the thread-specific error property when they completed
- Fixed a bug that occurs when launching comparison helper applications in a manner that was incompatible with files residing on an APFS snapshot volume
- Fixed a bug whereby an alias located in the immediate descendant of a resolved folder alias would not be resolved correctly
- Fixed a bug that was affecting the synchronizer's ability to identify self-referencing aliases when 'resolve aliases' was in effect and the target currently referred to an APFS snapshot volume
- Fixed a (harmless) bug that could result in wasted time and a guaranteed low-level error (and console messages) when trying to do Trial Sync or Sync Selection on an APFS snapshot
- Fixed a bug in resolving an alias on an APFS snapshot
- Fixed a bug whereby it was possible to convert an existing object that was marked as a symbolic link or directory to a regular file when updating attributes on Backblaze B2
- Fixed a bug in the Backblaze B2 storage provider whereby it wasn't always correctly identifying package files
- Fixed a bug resolving an alias file where it was possible that it would resolve to a URL but a file pathname could not be extracted from the URL causing an exception
- Fixed a bug whereby when presenting an error caused by enumerating folders in the file system, the object used to contain information about the error was volatile and could be corrupted by another thread that was preparing to present a different error likely resulting in a crash
- Fixed a bug whereby marking a folder node for exclusion would release all children and setup a potential crash for any other code that has retained a direct reference to one of those children. This is possible in Trial Sync and sync-selection scenarios
- Added logic to the outermost node processing loop that checks each node's exclusion state before attempting to process it to prevent unwanted operations and/or potential crashes
- Fixed a bug whereby attempting to retry a failed deletion of a file on the destination would trigger an unrecoverable, infinite loop and potentially cause a crash or memory consumption
- Fixed a bug whereby retry attempts would be performed on failed processing of nodes even if an abort condition were signaled
- Fixed a bug whereby when editing a previously created "When independent volume mounts" scheduled item, a "Connect" message was not being sent to the independent volume specifier. Thus the volume would always appear as "Not available" in the user interface even though it was
- Fixed a bug in the file system notification trigger that would not reliably start a live filesystem trigger after it was created
- Fixed a bug in the file system notification trigger that would not reliably remove a live filesystem trigger after it was disabled or deleted
- Fixed a bug whereby package merging between a source file system that supports millisecond timestamps (APFS) and a destination that doesn't could result in failure to efficiently merge
ChronoSync 4.9.0

Changes and enhancements:
- Optimized APFS Support for faster file scanning and copying
- A new 'Freeze file system' option allowing you to take a snapshot of your filesystem before syncing
- Mojave Dark Mode support
- Full Disk Access assistant to grant ChronoSync permission to fully access your files
- A completely overhauled ChronoSync Organizer window with better sorting and organization options, along with a toolbar, allowing easier access to task functions
- Improved Restore function allows you to recover data directly and with greater control from the Analyze panel
- Touch ID Support feature to allow ChronoSync to access system data
- Smarter Assistants that can format drives and disk images using an APFS filesystem
- New "Running Scheduled Tasks" System menu option to monitor your scheduled tasks without having to open ChronoSync
- Improved Container Editor interface includes a "Special Notes" section and now displays more information about each contained task
- Can now instantly access task logs directly from the ChronoSync Organizer window
- Better management of ChronoAgent connections
- Faster launch and shutdown times
- More efficient Amazon S3 and Backblaze B2 data transfers
- A new Validator "Recommended Settings" button


ChronoSync 4.8.7
Changes & Enhancements:
- Added support for path-style URLs in the Amazon S3 Connection.
- Added intelligence to the Amazon S3 connection setup process so that the "Path-style URLs" setting is automatically enabled during a "Test" connection if the remote server requires it.
- Constructed URLS no longer escape the '/' character when appending the object key in the Amazon S3 Connection.
- We now include the 'Date' header when constructing the string that is used to sign any request to Amazon S3 connections.
- Improved the responsiveness when trying to abort agent-based tasks after a connection is abruptly broken.
- Changed the behavior of "Open Other..." so that it defaults to the current location of the "Task Documents" folder as specified in the "ChronoSync->Preferences->General" panel.
- Added logic to prevent sync-on-launch and sync-on-quit jobs from running when ChronoSync is launched and quit via scheduled task execution.
- Limited requests for some unneeded volume data which results in slightly more efficient operations on HFS+ volumes in certain instances.
- Volume mount checks now occur within their own autorelease pool.
- The file format accessory view is now only displayed on Save if the current document is NOT a v4 document format.
- Fixed various minor auto-layout problems, tooltips and spelling errors throughout the App.
- Update Online Help.

Bug Fixes:
- Fixed a potential crash if a log window was left open while the parent document window was closed by the user.
- Fixed a bug whereby auto-exclusion of root folder items was not properly occurring.
- Fixed a bug whereby the "Optimizing" message during a bootable backup would not be displayed under certain circumstances.
- Fixed a minor bug whereby the wrong Resource Fork handling mode was set briefly after connection with the remote file manager is established.
- Fixed a bug whereby the diagnostic setting was not being automatically applied to previously created task documents.
- Fixed a bug whereby pasting a rule into a group would not set the rule's parent properly, eventually resulting in an exception being raised.
- Fixed a bug whereby opening a task document on the Archive panel would result in no archive path being displayed.
- Fixed a bug whereby the Google Cloud service object was not being deallocated after a connection was closed.
- Fixed a potential problem where an occasional exception while browsing files on an 'Admin Access' connection was being thrown.
- Fixed a bug whereby the online help was not being linked from the B2 Connection Profile editor.
- Fixed a bug whereby the test for nested folders in the Multi-Folder Assistant could easily be tricked by partially matching folder names e.g. "/Test Folder 2/Subfolder" would be flagged as a child of "/Test Folder".
- Fixed a bug whereby the custom folder selector wasn't being displayed when downloading an update.


ChronoSync 4.8.6

Enhancements:
- Added support to connect directly to the BackBlaze B2 cloud service
- Added new Dock menu items to provide quick access to open the ChronoSync Organizer and Scheduled Task Manager windows
- The Backup to Disk Image Assistant now has a relaxed storage space requirement when creating a sparse/sparse bundle disk image. As long as we’re not sizing the image based on the source, we will allow the creation of disk images with only a minimal amount of free space on the destination. This allows you to create, for example, a 1 GB disk image when only 700 MB is free
- We now makes sure that a connection is NOT in progress when attempting to mount volumes or verify targets
- We eliminated the duplicate ChronoSync Organizer window entry from the Window menu
- The ‘percentComplete’ reported by a Sync Task now subtracts any in-progress file copies before calculating the percentage to provide more accurate progress reporting in places such as the Scheduled Task Manager and Task Container Task List panel
- We reworked the logic associated with ChronoSync starting up ChronoAgentLocal and determining if it is running and ready for business
- We now post "Reset sync history" to the synchronizer's log whenever a "Reset Sync History" operation is performed
- We added log messages that get posted when updating the Preboot volume on an APFS bootable backup
- We now always attempt to delete the mount point for the Preboot volume even if the unmount attempt fails (which probably happens because it wasn’t mounted)
- When running the updatePreboot command after an APFS bootable backup, we now better deal with errors caused by deleted directory service users
- Added extensive workaround logic to deal with diskutil’s newfound (10.13.4) inability to create & mount APFS auxiliary volumes at custom mount points
- Added logic to deal with problems with diskutil not mounting APFS auxiliary volumes on DiskImages (a problem which existed prior to 10.13.4)
- We added an exception handler to manage potential system exceptions that could occur when requesting removable volume insertion
- We added an exception handler to prevent problems displaying the Task Container Task List
- We added more descriptive error strings for the SSL-related error codes -1200 thru -1206
- Changed some diagnostic error messages so that they always get posted, not just on debug builds
- Updated localizations

Bug Fixes:
- Fixed a bug in the Google Cloud connection whereby replaced files would have the ‘hidden’ attribute set
- Fixed a potential error in the Google Cloud connection by making sure we have buffered data available to re-attempt an upload for the previous data block, if requested
- Fixed a bug in the S3 connection whereby replaced files would have the 'hidden' attribute set
- Fixed an inefficient attribute caching bug when connected to Amazon S3 with no metadata preservation enabled
- Fixed a bug whereby the "Get" localized string had the incorrect key
- Fixed a bug whereby the sync statistics (scan count, error count, etc) would not be properly updated when processing items concurrently in a contained synchronizer task. This would yield inconsistently wrong summary statistics, though it wouldn't affect the accuracy of the sync/backup task
- Fixed a potential hang when monitoring the startup of ChronoAgentLocal
- Fixed an Assistant UI glitch that caused the feedback of individual steps of the task creation process to be cut-off if they were too wide


ChronoSync 4.8.5

Enhancements:
- Added logic to all of the assistants that ensures the 'Tasks' folder exists before proceeding to name & generate a task document
- Introduced a minor tweak to how detailed file information is displayed to prevent queueing up a bunch of display requests for the same item
- ChronoSync now disables the keychain UI to (theoretically) eliminate the "ChronoSync wants to use the ChronoAgentLocalKeychain" dialog from appearing
- Enhanced error logging for keychain API errors to help when debugging keychain access issues
- Implemented a completely different method of determining if ChronoAgentLocal is running and ready to receive connections
- Implemented a feature whereby holding the OPTION key down while switching to the Advanced tab of any Connection Profile Editor reveals the 'Diagnostic logging' option, provided the connection profile supports it
- ChronoSync now intelligently disables the "Archive replaced files" option if it is not currently ON and the destination file manager doesn't support archiving as well as chooses the appropriate deletion method
- Added workaround logic to better deal with file managers that may not properly aggregate packages
- Added logic to deal with the possibility of exceptions being thrown when a filename has a malformed UTF-16 name
- Hardened the log entry logic to better handle subtle corruption at the expense of losing a log entry
- Added exception handlers to deal with unexpected exceptions that may occur at certain points within the file deletion and file copy operations
- Reworked how the copy buffer size is negotiated between targets
- Implemented a new, 'System-to-Server' Readiness Error that will prevent a task from running if it targets the boot volume as the source and a file server as the destination
- Made a change to the Container Synchronizer that should allow it to abort much quicker
- ChronoSync now only simulates user activity on scheduled runs when the wake-to-sync preference setting is enabled to prevent unwanted screen wakes
- The Validator will now retry after content mismatches to eliminate a lot of 'false negatives' on cloud-based validations
- ChronoSync now posts more detailed error codes to the log for certain validation errors
- ChronoSync now posts error messages to the console log if a file system error occurs when refreshing an item's attributes
- Tweaked the formula for calculating maxConcurrentOperationCount so that fewer operation threads are spawned for cloud connections
- Enhanced the retry delay logic to better respond to aborts during the delay
- Added diagnostics that get generated when the Bootable Backup or Disk Image Assistant fails to save the generated document
- Updated tooltips

Bug Fixes:
- Fixed a CRITICAL bug introduced in v4.8.4 whereby hard links recreated on the destination of a sync would all reference the same exact object
- Added logic that will force all multi-hard linked files to be synchronized on the next full run so that the new hard-link logic can correctly recreate them on the destination. If a sync has not been run since Nov 27th, 2017, the fix doesn't need to be applied since that is the earliest date that the the bug could have appeared
- Fixed a bug whereby if a user abort occurred at precisely the wrong time, it was possible that the item(s) being scanned at the time of the abort would be force-synchronized even if they didn’t need to be copied
- Fixed a bug whereby if an open Container Task Document job was invoked from the Scheduled Tasks Manager window, there was a chance that aborting the run would lead to a hang
- Fixed a bug that could cause crashes if scheduling/clearing power manager wake events returns an unexpected error
- Fixed a bug that could cause a deadlock if scheduler jobs were being run with their sync/container task document windows open
- Fixed a bug whereby if the user chose a custom grace interval but not a max interval, the grace interval was allowed to exceed the default max interval of 300 seconds. We now assert a max interval of 3x the grace interval in such circumstances
- Fixed a bug whereby you could not open the Synchronizer Log window when running a Validation
- Fixed a bug when aborting Amazon S3 connections
- Fixed a bug whereby a never-saved task document that is 'saved as default' would become the default document rather than remaining unsaved
- Fixed a bug whereby a never-saved task document that is saved as a Template would become the template document rather than remaining unsaved
- Fixed a bug that would cause the Bootable Backup Assistant to spin indefinitely if saving the generated document failed
- Fixed a bug whereby selecting a bookmark in the Log window was stealing focus from the log list


ChronoSync 4.8.4

Notable enhacements:
General:
- Added more intelligence to the Analyze Panel in an effort to reduce/eliminate unnecessary refreshes
- Posting entries to a task document’s log during a synchronization is now less thread intensive
- A ‘bootable’ trigger mode will now enable the EA and ACL variable attribute triggers, but only if both targets support ‘ExtendedInfoCollection’ i.e. not for connections to old versions of ChronoAgent
- Implemented an alternate technique for aggregating package files that is much faster on APFS file systems. We now use optimal package aggregation techniques depending on whether we are accessing an APFS or HFS filesystem
- Internally, all timestamp manipulations & comparisons are done with sub-second precision. The UI still floors to the nearest second, however
- The Scheduled Tasks database is now loaded and instantiated in a background thread. If you have a large schedule and/or slower computer, ChronoSync will launch faster but you’ll see a delay before scheduled entries appear
- The filesystem validation logic employed when scanning the contents of folders will now try to adapt to inconsistencies detected in the file system rather than immediately throwing an error. This is because High Sierra is reporting a lot of inconsistencies, especially with SMB mounted file servers
- If package dissection is OFF, maintaining an archive which contains package files is now much more efficient. Depending on the nature of your sync/backup task, this could yield a significant performance improvement
- Added the ‘Post more detailed information to the log’ checkbox to the Validator UI. This determines whether or not detailed info will be posted about mismatches. This used to be controlled by the Synchronizer’s equivalent property but now you can control the behavior independently
- Now prevents the system from sleeping when restoring or deleting a batch of files in the Analyze Panel
- The process of connecting to target file managers in a scheduled sync (one that runs without a user interface) is now more streamlined & efficient
- Added new Chinese and Paris endpoints to the Amazon S3 Connection Profile Editor
- When creating a folder as part of a sync operation, we now wrap the operation in a compound task

Scheduler:
- When the system wakes from sleep, we added logic in an attempt to thwart the problem where, sometimes, the system wakes from sleep for a scheduled sync, but then goes back to sleep before the sync can be started
- Reworked the 65 second wake assertion we create after invoking a scheduled sync so that it asserts user activity during that time frame if wake-to-sync is enabled
- Added additional operations that generate diagnostics if schedulerDebug is enabled
- The application’s scheduler and scheduled items manager now waits for the background scheduler to be launched before starting themselves up (but won’t wait more than 5 seconds)
- When the system wakes from sleep, we now attempt to schedule the next system wake event. This is an attempt to thwart the problem where a system may stop sending us sleep notifications before putting the system to sleep
- We now schedule a wake event whenever a change is detected in the scheduled items database, the WakeToSync preference is enabled, or the scheduler is turned ON/RESUMED. We also remove all of our scheduled wake events whenever the WakeToSync preference is disabled, or the scheduler is turned OFF/SUSPENDED
- Implemented a scheme whereby a deadlock in the coordinated read/write of the scheduler database can be broken, thereby disabling the coordinated read-write system. The deadlock breaks after 15 seconds and an error message will be posted to the ChronoSync-Console.log or ChronoSync-Scheduler-Console.log
- Tweaked the heartbeat logic so that if it has been over 100 seconds since we last checked the schedule, we treat it as if it were an awake-from-sleep event
- We now declare user activity at the beginning and end of a scheduled sync

Bootable Backup:
- /private/var/run and /private/var/tmp are no longer content- blacklisted for bootable backups
- /private/var/vm is now content-blacklisted for bootable backups
- Added logic to the bootable bless process that ensure /private/ var/vm exists on the destination
- Added logic to the bootable synchronizer that will only ‘touch’ the system extension folders if .kext were actually copied/deleted by the sync. This triggers a rebuild of the kext caches
- The Bootable Backup assistant now enables auto-mount for the destination device in all instances. It used to only do this if it was formatted as an encrypted volume by the assistant
- Deleting a .dylib file is now considered ‘copying’ one, so the dylib caches will get rebuilt at the end of a bootable backup

APFS Bootable Related:
- Added initial set of console messages that get generated when synchronizing the APFS Recovery partition fails
- When synchronizing the Recovery volume as part of an APFS bootable backup, we now dump the Recovery synchronizer’s log to the console if any errors were generated
- Added diagnostic messages that get generated when preparing/ refreshing an APFS Preboot volume
- If our initial manual prep of the Preboot volume fails, we now try to call updatePreboot to see if it can prep the volume. Previously, we only called updatePreboot after our manual prep succeeded
- Added logic to make sure the destination Preboot volume is dismounted after calling the updatePreboot utility because that utility has a tendency to leave it mounted if it produces an error
- All files and folders created while constructing an APFS Preboot volume are now owned by root:wheel
- When refreshing an APFS Preboot volume, we now completely delete the /var/db folder in the volume’s Preboot container and let the upodatePreboot utility rebuild it from scratch
- Modified the Bootable-Backup Recovery volume refresh logic to deal with situations where the source and destination volumes reside within the same APFS container

ChronoAgent Connection Related:
- Added a mechanism whereby the maximum number of pooled command sessions is limited by the maxPooledSessions property
- The prepareToSync method now sets the maxPooledSessions property (if supported) of the target file manager based on the maximum number of concurrent operations plus two

Cloud Related:
- Added logic so that if the MIME type returned by the OS does not conform to “type/subtype”, the default MIME type (typically “binary/octet-stream”) is used as the result

Miscellaneous:
- Reduced the rate of update checks from the ChronoSync Scheduler to once every 24 hours (from once every 12). Our update-check server will be thankful
- Changed the animation style of the ChronoSync Organizer window to ‘none’. Having it ‘zoom’ open all the time was deemed annoying
- Added a 15 second wake assertion at application startup
- We now explicitly set the NSAppSleepDisabled = YES application preference setting when launching the main ChronoSync application
- Enhanced the DocumentRef’s ‘verify’ method (used by ChronoSync Organizer) so that changes to the ‘displayName’ property are made on the main thread. This is in response to some messages about modifying the auto-layout engine on a background thread that were observed in customer-supplied logs, even though this has never been witnessed
- Added logic to the SyncTarget’s setFileTimestamps:atPath: method which will use an alternate API for setting creation & modification date if the item resides on a non-AFP file server while running High Sierra (or later). This method is mainly used on folders
- Added more FMAudit diagnostics to the createFileNamed:inFolder:attributes:flags:newFileRef: method to try and shed light on mysterious permission errors
- We now redirect stdout to our private log files in addition to stderr

Notable bug fixes:
- Fixed a bug in the Remote Target Selector whereby folder contents presented to the user were not being sorted
- Hardened some code in the remote target selector UI to reduce the possibility of exceptions getting raised
- Fixed a validator bug whereby sockets and devices were being included in orphan counts
- Fixed a bug in the Validator whereby if the user aborted a validation, the file that was presently being compared would get reported as being mismatched. That could cause confusion with the user
- Fixed a bug in the Validator whereby it would always skip invisible items if Ignore Invisibles was enabled. It really should only skip them if the *source* item is invisible. If it is a bidirectional sync, it should only skip if *both* items are invisible. Otherwise, it could be a mismatch and should be reported
- Fixed a bug in the Validator whereby the ‘Skip Aliases’ setting was being ignored when comparing the contents of file packages
- We now clear the package aggregation cache of both target file managers before running a validation
- Fixed a relatively rare problem which can occur when working off a bootable backup of a system which had ChronoSync installed, and the default document template contains target specifications for volumes that are still online
- Fixed some bugs related to the mount-check performed prior to any mass file deletions (and periodically during a sync). The bugs would a) lead to ‘false positives’ meaning some file servers could erroneously have dismounts detected, and b) when such a dismount was detected, the error message was extremely unhelpful
- Fixed a bug whereby, sometimes, authenticating for admin access would cause the Scheduled Tasks Manager window to stay hidden after authentication
- When moving a file to an archive, we now have an exception handler to catch any exception raised in the process of enumerating a folder in the archive. It will now generate an error rather than throwing an unhandled exception
- Fixed a bug whereby having the “Don’t create empty folders” setting enabled and running a Trial Sync would skip any folders that need deletion or attribute-only syncs
- Fixed a bug whereby the display of Roll Back Errors was not interpreting the temporary pre-determination value that was set by previous invocations of the routine which would lead to it being interpreted as the status flags for other roll back warnings
- Fixed a bug whereby in some cases, posting a verbose log message about file deletion would only show the filename instead of the relative path
- Fixed a bug whereby some systems mis-report information about running processes and this was confusing ChronoSync into believing that ‘Admin Access’ was not available. The result was an inability to choose “Mounted Volumes (Admin Access)” and might also be the cause of nagging Keychain prompts that some users have reported
- Fixed a bug when performing a coordinated load of the scheduler database whereby we were briefly referencing a released object (both in ChronoSync and ChronoSync Scheduler)
- Fixed a bug when performing a coordinated load of the Connection Profiles data store whereby we were briefly referencing a disposed object
- Fixed a bug whereby agent connections (including ‘Admin Access’) that support command pooling were creating superfluous, ‘dead’ command sessions during initial connection and whenever the command session pool filled up
- Fixed a bug whereby the ChronoSync Scheduler’s system menu could get ‘stuck’ displaying the last frame of an animation. The frame would remain until the user interacted with the menu or another scheduled sync caused it to snap out of the stuck state
- Fixed a bug whereby it was possible that a popover window would get released before it had fully dismissed. This tended to cause crashes on some systems (mostly 10.11, it seems)
- We now delete the ChronoAgent port semaphore file on the destination (if it exists) during the bless phase of a bootable backup. This should eliminate the ‘Abnormal Startup’ warning that ChronoAgent will present when you boot off the destination


ChronoSync 4.8.3

Notable Enhancements:
- Implemented the all-new 'False Mount' Readiness Test that checks to see if one of the targets is referencing a folder in the "/Volumes" folder
- Eliminated the possibility that ChronoSync would ever create a phantom volume in the "/Volumes" folder because the OS lost connection to a server or local device but failed to return an error message to ChronoSync
- Added logic to work around High Sierra bugs when renaming files on file servers as part of a Safe Copy or Archive Move operation
- The Validator and sync engine now filter out some legacy Finder Flags when detecting attribute changes
- Tweaked the IO throttling logic so that full throttle is restored after 10 seconds of system inactivity versus 30 in previous versions
- Changed auto-update checks so they are not performed when syncs are running
- Removed a bunch of unnecessary user interface updates when changing a target's volume
- Invoking the ChronoSync Organizer or Preferences window will now terminate auto-quit, if we were invoked for scheduled synchronization
- We now consistently produce data verification diagnostic output based on the DataVerificationAudit plist setting
- Improved mirrored log file behavior by recreating mirrored log file if necessary to avoid situations where the mirrored log file may have been deleted while still posting messages to it
- The ChronoSync Scheduler now tries to keep the system awake a little longer after triggering a task to run
- Improved user-controlled diagnostics for the Scheduler and Validator

Notable Bug Fixes:
- Changed how the ChronoSync Scheduler checks for missed jobs that could lead to erroneous triggering of sync jobs after a system wakes
- Fixed a bug whereby 'Run Once' scheduled items would not always run on the minute they were intended but would launch one minute later
- Fixed a bug whereby 'Run Once' scheduled items would repeatedly run after their first execution because they would not disable themselves
- We now turn off left or right target triggers if they are enabled but the target volume is not suitable for a live-trigger scheduled item
- Fixed a bug whereby adding a scheduled item from the Scheduled Task Manager window would fail if the first Sync Task document known to the program could not be found on disk
- Fixed a bug in the Validator whereby marking mismatched entries would result in forced-conflicts if the task was configured as a mirror
- Fixed a bug in the Validator whereby it could try to reference an object that doesn't exist, resulting in a crash
- Fixed a bug in the Validator whereby a NULL Finder comment was considered different from an empty Finder comment
- Fixed a bug in the Validator whereby, when NOT validating out-of-sync items, we failed to have the synchronizer refresh the attributes of each file pair. That could lead to an incorrect determination of whether or not the file-pair is considered out-of-sync
- Fixed a bug whereby the Validator had no additional logic to deal with package mismatch scenarios. It was thus prone to reporting modification date differences when one target thought a folder was a package but the other didn't
- Fixed a bug in the Validator whereby the 'Package Handling' setting of 'dissect' was not being taken into consideration when validating modification dates
- Fixed a bug whereby translated resources for the Access Restrictions user interface were never merged in with the program
- Fixed a localization bug whereby target descriptions were not being properly constructed in Japanese
- Fixed a crashing bug introduced by a change to how Google Cloud returns metadata values. The change occurred somewhere around Nov. 1st, 2017
- Fixed a bug whereby changing the connection method for a target between "Mounted Volumes" and "Mounted Volumes (Admin Access)" would revert to a "/Volumes" relative path on the boot drive
- Fixed a bug whereby the "Confirmation Test" connection role was never being sent to a ChronoAgent when testing a connection
- Fixed a bug that occurs when probing SFTP servers for their capabilities that could result in a failed connection
- Fixed a bug whereby selecting a target identical to the previous one would not clear the "Configured on a different system" readiness warning
- Fixed bug in preparing and updating the progress bar when performing a Sync Selection or Trial Sync Selection operation
- Fixed a bug whereby disabling the summary sheet in a container task window would prevent the window from being closable
- The Trial Sync Selector sheet window no longer crashes if the task is aborted behind its back (such as when targets become lost)
- Fixed a bug whereby resetting the sync history would not 'forget' certain values
- Fixed a bug whereby evaluating rules was not thread safe resulting in possible problems during concurrent operations
- Fixed a bug whereby a forced attribute sync on a folder would trick the pruning logic into pruning that folder if no child items were processed
- Fixed a bug whereby file servers could fail to refresh their displayed state in the Analyze Panel after performing a sync, deletion or restore
- Fixed a bug whereby trying to apply attributes to a folder that was really an alias to a folder (with resolve aliases enabled), would wipe out the alias
- Fixed a bug whereby resetting the status of a force-sync'd file-pair would not refresh the file pair and thus not immediately show the correct status of the file pair
- Implemented a workaround to a bug in the 'bless' utility whereby a bootable APFS volume might not appear when invoking Startup Manager (Option-Boot)
- Fixed a bug that affected the Bootable Backup assistant to ensure that if multiple volumes exist in an APFS container, only bootable volumes can be chosen as the source target
- Fixed a bug whereby presenting the Termination Window (i.e. "There are scheduled syncs running, do you really want to quit?") would eventually cause the menubar to stop animating


ChronoSync 4.8.2

Enhancements:
- Tweaked the “Optimization” phase of bootable backup tasks so that the destination volumes would boot more efficiently and reliably, especially if they contain a High Sierra installation

Bug Fixes:
- When calculating the next scheduled run date of a scheduled task, the program (both ChronoSync and ChronoSync Scheduler) would hang if the next run date fell after a Daylight Savings Time-to-Standard Time transition
- Running a container task that encapsulated multiple sync/backup tasks that simultaneously process many files (via concurrent operations) was susceptible to crashing when closing the container task window
- Specifying a source or destination target that resided on an APFS filesystem would result in the “Strict volume identification” setting defaulting to OFF


ChronoSync 4.8.1

Features:
- Full macOS 10.13-High Sierra compatibility
- Added a feature whereby holding OPTION down when selecting a task for any Modifier Assistants will now select/deselect ALL listed tasks
- Added the ability to schedule a free standing task document if no tasks are being tracked in the ChronoSync Organizer window. Also, holding the OPTION key down when clicking (+) in the Scheduled Task Manager window then displays the File Chooser to select a free-standing task document

Enhancements:
- The user interface animations for all Assistants and the Validator function were reimplemented to work around High Sierra shortcomings
- The ChronoSync Installer and Uninstaller were modified to work around High Sierra bugs
- When creating a bootable backup to an APFS volume, the VM, Preboot and Recovery volume structure in the destination APFS container is constructed
- Added the correct Analyze Panel status icons (for attributes-only syncs) to the online help
- The process of blessing a destination volume in a bootable backup is now more verbose, displaying fine-grain progress to the user and posting relevant errors to the log
- When the Bootable backup assistant is presenting a warning that the destination volume is about to be erased, it checks to see if it is an APFS container with additional data volumes within it. If so, it presents those additional volume names as part of the warning
- The Readiness Warning stating that APFS destination volumes may not be bootable is only reported if APFS volume operations cannot be performed on the destination

Bug Fixes:
- Fixed several bugs associated with the display of Trial Expiration notices when running the application in Trial Mode
- Fixed several bugs associated with performing automatic update checks
- Fixed a memory consumption problem that occurs in kernel_task memory when verifying large files
- Fixed a bug in the Container Editor’s task list whereby user modifications to the width of the Task Name column would not be preserved after closing the document
- Fixed a bug in the ChronoSync Organizer whereby the view that displays each document’s information would not automatically grow with the width of the window
- Fixed a bug that could cause a deadlock between the main ChronoSync application and the ChronoSync Scheduler. Under the wrong circumstances they would both wait on the other to obtain access to the scheduled items database
- Fixed a layout bug whereby unusually long task names would scroll off the top of the Scheduled Item Editor window
- Fixed a bug whereby hitting “Test” when multiple Push Receiver IDs were specified, and a space was used to separate the IDs, the test would fail. This existed in the sync task Options panel and the Notifications Assistant
- Fixed a bug whereby in the same scenario above (space between IDs), the Notifications Assistant would not store the Receiver IDs into the modified documents properly
- Enabling Push Notifications in the Notifications Assistant now forces “Only on Errors” setting OFF. Previously, it only did this if Push Notifications was OFF and it was turning them ON
- Fixed a bug whereby pausing a running sync wouldn’t necessarily pause it
- Eliminated a specific type of crash that could occur when scrolling through entries in the Trial Sync selector window
- Eliminated some data verification audit messages that were always getting posted to the console
- The Container synchronizer now properly updates the correct duration property on sync completion so that push notifications to ChronoMonitor will contain the correct duration value


ChronoSync 4.8.0

Enhancements:
- Added the ability to uniquely identify APFS volumes.
- Added the ability to determine the partitioning scheme of APFS formatted volumes.
- Added the ability to correctly identify whether or not an APFS volume has a bootable OS on it.
- Added the ability to mount Encrypted APFS volumes.
- Added the ‘APFS bootable destination’ readiness test that warns that a destination APFS volume may not be bootable which will be removed once we can guarantee APFS boot-ability.
- Added support for cut, copy, paste operations on Rules.
- Added the ability to detect when Sync Task is moved to another system.
- Added the ‘configuration system mismatch’ readiness warning that gets displayed when a Sync Task is opened on a system other than that which created/edited it.
- Improved Scheduler efficiency by reworking algorithms that calculate next item run date.
- When closing a scheduled item editor window, we now re-display the ChronoSync Organizer window, if necessary.
- Added “/Network” and “/dev” to the bootable blacklist.
- As part of the Bootable Backup, we now ensure that a “Network” folder is created on the destination and that it is marked ‘hidden.’
- The sync completion notice now displays a “View Log” button if the just-completed synchronization generated an error that was posted to the log.
- Improved Document and Window Close behavior by reordering the operations that occur when deallocating the user-interface resources.
- Standardized the behavior of focusing on the associated entry field when an particular option is turned on or selected throughout the user-interface.
- Added “.strings” to the default set of files that will be opened using OpenDiff when invoking the Compare function. This will only affect new installs.
- Updated and expanded file types covered by the “Common...” set of rule templates.
- Changed the Installer’s minimum OS requirement to 10.10.
- Added logic to detect the vendor name of any locally attached drive.
- Added many more log messages to the installer to facilitate troubleshooting failed installs.
- We now display a “Trial Expired” notification after the trial period has elapsed.
- Improved in-app Update Check Now performance.
- Added a “Buy” button to the Trial Period notice.
- Added Postbox email bridge.
- Added Airmail 3 email bridge.
- Remove QuickMail from email bridges.
- Numerous terminology changes, user-interface changes and tweaks.

Bug Fixes:
- Fixed a bug where the installer was not always properly identifying an existing login item and would fail to re-launch the Scheduler at the end of the installation.
- Changed the behavior of log mirroring so that if there is a problem opening/creating the mirrored log file, we no longer disable mirroring.
- Fixed a bug whereby adding messages that spanned multiple lines to the sync log could result in out-of-sequence log messages.
- Fixed a problem in the Log window whereby highlighted error text (in red) was very difficult to read.
- Fixed a potential hang condition by reorganizing thread locks.
- The Google API was not capable of returning more than 26,000 objects in a “folder” when automatic page fetching was enabled (which is what we do). Thus “folders” would never appear as if they contained more than this many files. If backing up a folder with more than this many files in it, ChronoSync would always copy the files beyond the 26,000 count because it would look like the files did not exist up on Google Cloud, even though they might.
- Fixed a potential crash by ensuring thread safety in string formatting calls.
- Fixed a bug whereby a connection to each target’s file manager was being made when both targets were being monitored to sync-on-mount. This would fail if either target was an Admin Access target.
- Fixed a bug in the synchronizer that was keeping track of hard link references in a non-thread safe manner. This could lead to crashes when running parallel ops.
- Changing target folders and resetting sync history will no longer purge exclusions and forced synchronizations. If the folders where exclusions and forced syncs are defined still exist after the target change, they will be retained.
- Fixed a bug in the MS-DOS filename restriction readiness test that was identifying APFS as MS-DOS.
- Fixed a bug whereby duplicating a rule that appeared below an expanded rule group would raise an exception.
- Fixed a bug whereby invoking the contextual popup on a non-focus rule list and invoking ‘Duplicate’ would not duplicate the desired item.
- Added an exception handler to the rule base.
- Fixed a bug whereby disabling a rule group would result in all contained rules being disabled when the sync task document was saved.
- Fixed a bug whereby changing a target’s connection method would never preserve sync outline customizations (exclusions, forced syncs) even in cases where they could be preserved.
- Fixed a bug whereby the Analyze and Archive panels that was causing Core Animation warnings on the console and possibly the cause of intermittent crashes.
- Added logic that forces all ChronoSync Organizer window resources to load before we try to display it in an attempt to fix the intermittent ’tooltip crash’.
- Fixed a bug whereby scheduler induced sync when a container document window was opened would not set the completion flag when finished. Thus subsequent scheduled syncs would fail as long as the app was running.
- Fixed a problem whereby if a Container sync window were open and displaying the summary sheet from a previous, manually induced synchronization, a scheduled sync for that container would not be possible.
- Fixed a bug whereby the master container progress bar was being initialized on a background thread.
- Fixed a logic flaw whereby the next scheduled synchronization displayed in STM Window and the CS Menu would not always be correct. Another problem was that missed sync calculations would sometimes result in scheduled tasks running erroneously.
- Fixed a bug whereby running a scheduled sync with the corresponding sync task document window open could result in UI modification.
- Fixed a bug whereby changes to some properties of SFTP connection profiles would not get applied to existing documents that used the profile.
- Fixed a bug whereby the animated menubar icon during scheduled syncs would not occur under specific circumstances.
- Added experimental logic so that a ‘hang’ that occurs while collecting entries for a right target File Sharing Connection can actually be broken via an abort by the user.
- Worked around a nuisance bug that was causing console messages to the effect of “__weak variable at...".


ChronoSync 4.7.6

Enhancements:
- Implemented Readiness Warning to suggest 'Bootable Backup' Operation when the Startup Volume is the chosen target for any other 'Operation'
- Added logic to better preserve the currently selected Target path when changing the 'Connect to:' popup for a Target

Miscellaneous:
- Updated how keychain entries are managed
- Changed the behavior of log mi

檔案下載 檔案下載