IO Ninja changelog
==================

This changelog is a manually cleaned-up git log of important changes
happened in-between the official IO Ninja releases.

Modules
-------

  * Main application - the two main executables (ioninja, ioninja-server)

  * Hardware client - a command-line executable (ioninja-hwc) for controlling
    the IO Ninja taps and other hardware (e.g., serial ports)

  * Scripts - open-source Jancy scripts (*.jnc) which implement all of the
    IO Ninja plugins.

  * Ninja Scroll - the proprietary logging engine of IO Ninja (statically linked
    to the main executables)

  * Device Monitor - partially open-source tools, libraries, and kernel-mode
    modules allowing to intercept and monitor communications between
    user-mode applications and kernel-mode device drivers

  * QT Property Browser - a heavily modified fork of the official QT property
    grid library

  * Jancy - an open-source scripting language with C-compatible structs,
    safe pointer arithmetic and spreadsheet-like reactive programming
    (jancy.dll/jancy-edit.dll/libjancy.[so|dylib]/libjancy-edit.[so|dylib])

  * AXL - an open-source support library used in all IO Ninja components

Changelog Items
---------------

  ! denotes an important update or a critical bugfix
  + denotes a new feature
  - denotes a bugfix or a removed feature
  * is used for all other changes (re-factorings, updates, etc)

................................................................................

version 5.11.0-a (2026-06-25)

  Service release (affects Windows MSI FULL installers only).

  Re-packages MSI FULL installers to bundle tdevmon-3.3.18 that doesn't have
  dual signatures in kernel-mode .sys drivers (which causes validation errors
  on some Windows builds)

................................................................................

version 5.11.0 (2026-06-25)

  Major update. Introduces rendering of wide CJK (Chinese/Japanese/Korean)
  ideographs, emojis, and other Unicode codepoints (including glyphs missing
  from the chosen font) in all relevant widgets: log, hex editor, terminal;
  Windows ARM64 support in both the IO Ninja app and Device Monitor; new API for
  inter-session messaging in in-app scripts; multiple critical bugfixes.

  Main application changelog:

  ! nj_app: Windows ARM64 support
  ! nj_app: critical update: remove NoFontMerging, add Microsoft YaHei fallback
    on Windows (CJK rendering)
  ! nj_app: critical fix on mac: leaked 4 shm objects per session (app/srv
    read/write events)
  ! nj_hwc: critical typo fix: injection-flags setting essentially zeroed the
    control register
  * nj_app, conf: make built-in default colors match themes.conf; update the
    script inactive-selection colors for better visibility
  - nj_app: fix: prevent pulsing disconnect due to propagation of
    SessionConnectionState
  + nj_app: add New action to the IAS script pane
  + nj_app, nj_ias: inter-session messaging (Jancy and Python APIs)

  Scripts changelog:

  ! udp: critical regression fix: misplaced TCP keep-alive settings
  + ias: add inter-session messaging API
  - socket-log: typo fix: closeKind -> $closeKind

  Ninja Scroll changelog:

  ! njs_log, njs_term, njs_hexedit: double-width (CJK) and emoji rendering
  ! njs_log: critical fix: early bail from CachePage::addPart when page is full
  ! njs_log: critical fix: RangeProcessorMgr::stop() didn't guarantee completion
    of pending range processors
  ! njs_log: critical fix: race in MappedFile::view file-size change between
    readers and writer (read-only accessors lacked FileFlag_ReadOnly)
  ! njs_log: critical fix: findWordBoundary OOB on page boundary

  Device Monitor changelog:

  ! dm_win_sys, dm_lnk_lkm: critical fix: HashTable didn't resize properly
  ! dm_win_sys_core: critical fix: postpone IoDetachDevice/IoDeleteDevice when
    IRQL != PASSIVE_LEVEL
  ! dm_win_sys_pnp: critical fix: double IRP completion on
    IOCTL_INTERNAL_{KEYBOARD,MOUSE}_DISCONNECT
  - dm_win_sys_core: fix: MasterDevice_connectPnpDriver now propagates status
    instead of silently returning STATUS_SUCCESS
  - whdc: fix: inf signature should be $WINDOWS NT$, not $Chicago$

  Jancy changelog:

  * jnc_edit: hide brace-match and current-line highlights when unfocused; hide
    the current-line highlight when there's a selection
  - jnc_io_ssl: fix: set SSL_MODE_ENABLE_PARTIAL_WRITE |
    SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER
  - jnc_rtl: regression fix: rtl::ModuleItem cache was not properly zeroed
  + jnc_edit: add indent guides
  - jnc_edit: typo fix: enableTabsToSpaces didn't respect its argument
  - jnc_io_*: fix: failed select() was not handled properly
  - jnc_io_base: fix: wrong error set on failed ::write
  - jnc_io_cmn: ssl fix: FD_CLOSE during handshake must be handled differently
  - jnc_io_ssl, jnc_io_websocket: fix: handle SSL_ERROR_SYSCALL (reset/abort was
    not reported otherwise)

  AXL changelog:

  ! axl_io: critical fix: missing ~Mapping() and ~NamedSemEventBase destructors
  ! axl_io_shmt: critical fix: off-by-one in ShmtReader streaming mode
  ! axl_sl: critical fix: potential infinite loop in BoyerMooreHorspool
  + axl_enc: double-width/CJK support (enc::isDoubleWidth, enc::ColLayout,
    enc::Convert::calcRequiredColCount)
  - axl_sys: fix: unicode consistency

................................................................................

version 5.10.3 (2026-05-11)

  Service release. Introduces Find in Terminal and Find/Replace in Text
  Transmit, Binary Transmit, and Script panes.

  Main application changelog:

  ! nj_app: major update: find and replace in all relevant widgets: text
    transmit, binary transmit, script editor, terminal
  ! nj_pyedit: critical fix: auto-indent in python editor inserted tabs and not
    spaces like it should have
  ! nj_ias: critical update: allow interrupting tight python loops
  ! nj_ias: critical fix: toString/fromString didn't respect `thin this`
  * nj_app: mac: add wake observer; clear font cache and update all widgets on
    wake (to mitigate post-wake visual glitches on macbooks)
  * nj_app: undo/redo/paste/clear/replace should not be possible on read-only
    widgets
  - nj_app: fix: re-enable all edit menu actions with shortcuts after menu
    closes (otherwise, shortcuts won't work even after we switch widget focus)
  - nj_app: fix: regex markup dialog didn't properly handle theme changes
  * nj_ias: monkey-patch time.sleep to make it interruptible
  * nj_srv, nj_ias: abort sync functions (most importantly, connect())  when
    aborting IAS scripts
  * nj_app: cleanup & refactor the settings dialog (add missing labels, remove
    unnecessary spacers, etc)
  * nj_ias: invalidate python caches before compiling
  + nj_app: handle copy in list boxes (QListWidget)

  Scripts changelog:

  ! socket-log: critical fix: log was not unsuspended if parsing of a socket
    address failed causing a non-responsive log
  * all: rename log record params and flags for consistency
  * file: fix: include file name null char into file open log record params
  - ssh: fix: ssh channel was not respecting TcpReset/TcpAborted events
  - ssh: fix: socket properties were not applied to an openssh channel
  - pcap: regression fix: ethernet packet templates were temporarily removed
    (because of ethernet template errors) and never restored
  * all: updates re latest socket-log change in TCP disconnect flags
  * socket-log: add SocketLogDisconnectFlags.Aborted and remap Reset flags
    maintaining backward compatibility with existing logs
  * tcp-server, ssl-server: don't insta-fail connectSession() -- instead, set
    SessionConnectionState.Connecting

  Ninja Scroll changelog:

  ! njs_term: find in terminal
  ! njs_log: critical fix: line highlight should not move caret (caused weird
    cursor jumps in pcap/ethernet tap plugins)
  ! njs_log: critical update: calculate zone offsets for text parts (now that
    we use print-to-log in scripting, merged multiline text blobs are common)
  ! njs_log: critical fixes: whole-word find didn't handle eof properly
  * njs_cmn: use enc::isWord/isPunct/isSpace instead of alnum/ispunct/isspace
  - njs_log: fix: swap selection start and end offsets for reverse-find
  * njs_hexedit: replaceSelection, replaceOffsetRange should return actual
    insert size (could be adjusted due to size limits)
  + njs_hexedit: add replaceOffsetRange()
  - njs_hexedit: fix: invalid redraw line range on insert-delete
  + njs_term: new terminal line processors: copy-to-string, find
  - njs_term: typo fix: active & inactive selection colors were swapped
  + njs_wdg, njs_hexedit: add ensureHexAsciiCursor()
  * njs_hexedit: add HexEdit::getCursorPosKind()
  * njs_log: stick-to-bottom should not follow the caret horizontally
  * njs_log: respect original cursor validation flags (instead of
    forcing caret validation)

  Jancy changelog:

  ! jnc_ct: add windows arm64 support
  ! jnc_io_base: critical fix: SocketEvents.TcpReset was never properly set on
    linux and mac
  * jnc_io_ssh fix: ssh channel was not respecting reset, timeout, or abort
  * jnc_io_base: rename SocketEvents.TcpTimedOut -> TcpAborted
  * jnc_ct: resolve aliases in Namespace::findItem(const sl::StringRef&) just
    like we do in the rest of findItem family
  * jnc_rt: don't set error on null tls
  * jnc_io_base: trivial: no need to check for SO_ERROR when recv() returns 0
  + jnc_io_base: add SocketEvents.TcpTimedOut and set it on windows & unix
  - jnc_std: typo fix: strichr didn't actually case-fold
  * jnc_ct: jnc::Jit::finalizeObject() should return bool (can fail in newer
    llvm versions)
  * jnc_ct: use elf object format on win-arm64
  * jnc_ct: compat fixes for llvm-20 .. llvm-22

  AXL changelog:

  ! axl_sl: critical updates: boyer-moore text find classes for utf16 and utf32
  - axl_io: minor fix: win::Socket::getError/psx::Socket::getError should not
    return 0 if getOption fails

................................................................................

version 5.10.2 (2026-04-17)

  Service release. Introduces code assist in Python editor, isolated Python
  package manager (pip-based), TCP keep-alive timeout settings, autoconst
  facilities in Jancy.

  Main application changelog:

  ! nj_app: new: pip-based local package management
  ! nj_pyedit: new: jedi-based code-assist (auto-completion, argument tips, and
    quick-info tips)
  - nj_app, nj_srv, nj_cmn: fix: set python home dir (otherwise, python looks up
    system-wide site-package lib)
  * conf: use standard paths for tmp, system-log-dir, crash-report-dir, tmp-dir
    instead of ~/.ioninja on linux & mac (~/.local/share/ioninja/ on linux,
    ~/Library/Application Support/ioninja/ on mac)
  - nj_pyedit: fix: improper check for indentation after ':' (e.g., function
    bodies after def foo(): were not properly indented)
  * nj_ias: use newly added axl classes for redirecting stdout/stderr
  * nj_cmn, nj_app, nj_ui_app: move axl<->qt conversion to a dedicated helper
    file in nj_cmn
  + nj_ias: export g_isConnected/g_pendingReceiveSize in jancy (is_connected/
    get_pending_receive_size in python)
  - nj_ias: fix: connect should raise an exception on error
  * nj_app: rename and make public: updateScriptPaneDispatch->updateIasContext/
    updateScriptPaneContext and call it when changing language in the ias edit
    container
  - nj_ias: typo fix: receive always returned the full buffer size, not the
    actual received size
  * nj_pyedit: enable tabs-to-spaces (standard for python)

  Scripts changelog:

  ! tcp, tcp-server, ssl, ssl-server, ssh, websocket, websocket-server: add
    TCP keepalive idle timeout/retry interval settings
  + ias: add properties g_isConnected, g_pendingReceiveSize (in python:
    is_connected/get_pending_receive_size)
  * python: replace tabs with spaces (standard for python)

  Jancy changelog:

  ! jnc_api, jnc_ct, jnc_std: major update: autoconst types (supersedes constif)
  ! jnc_io_base, jnc_io_ssl, jnc_io_ssh, jnc_io_websocket: add TCP keep-alive
    idle timeout & retry interval properties
  ! jnc_ct: major update: separate bool1 and bool8
  ! jnc_edit: extract base code assist functionality (to share with nj_pyedit)
  ! jnc_rtl: critical fix: rtl::Type::tryGetStringableValueString didn't respect
    thin-this
  ! jnc_ct: critical fix: short type lookup didn't respect this arg type flags
  ! jnc_ct: critical fix: failed instantiation during type lookup didn't clear
    instance item
  ! jnc_api, jnc_edit, jnc_ct: new code assist: template arg tips
  ! jnc_ct: member operator can now handle nested pointers (load pointers until
    we reach named type)
  * jnc_edit: don't request quick-info tip beyond eol
  * jnc_ct: rename CodeAssistKind_Undefined -> CodeAssistKind_None
  * jnc_ct, jnc_rtl: replace c-casts with static_casts for downcasts from
    ct::Namespace*
  * jnc_ct: rename: ModuleItemContex::setup -> setupContext
  + jnc_ct: support for template member functions
  - jnc_edit: fix: properly handle jnc.global in auto completion
  + jnc_edit: add new prop: Edit::isTabsToSpacesEnabled
  - jnc_ct: fix: incorrect thin-this asserts in DerivableType::compileDefaultXxx
  - jnc_ct: fix: when cloning arguments, copy decl context
  * jnc_ct: simplify template instantiation resolver (also make it more suitable
    for code-assist)
  + jnc_api: add TemplateArgType (so that we can look up default types)
  * jnc_ct: TemplateDeclType should be able to create deduction type by itself
    without relying on parent template
  * jnc_edit, jnc_ct: generate autocomplete on -> and respect overloaded
    operator ->
  * jnc_ct: ease up asserts in loadDataRef/storeDataRef (allow passing pointers
    without explicit indir)
  * jnc_ct: add template instance info to typedefs (used in code assist and doc
    gen)
  - jnc_edit: fix: clicking on synopsis column in autocomplete pasted synopsis,
    not name
  - jnc_ct: typo fix in Cast_DataPtr_FromClassPtr::llvmCast

  AXL changelog:

  - axl_py: fix: PyConfig_SetString/PyConfig_SetBytesString expect sz string
  + axl_py: add helper classes for redirecting stdout/stderr
  + axl_py: add py::String::fromString/createFromString for wchar_t* strings
  + axl_py: add py::Object::setAttr
  + axl_py: add py::List::setSlice(), add default size = 0 for
    py::List::createNew()
  * axl_py: move import functions to axl_py_Module.h
  + axl_sl: add string macros for creating literals without invoking strlen
  - axl_py: typo fix: PyObject_CallMethodOneArg had name and arg params swapped
  + axl_py: add py::Object::isNone()
  + axl_io_win: add default overlapped = NULL for wsa operations on sockets

................................................................................

version 5.10.1 (2026-02-13)

  Service release (Linux-only)

  Main application changelog:

  ! package/linux: critical fix: missing libpython*.so libraries

................................................................................

version 5.10.0 (2026-02-13)

  Major update. Introduces In-App Scripting in Python; major changes in Jancy
  language including addition of templates.

  Main application changelog:

  ! nj_app, nj_srv, nj_ias: new: support for in-app scripting in python
  ! nj_app: detect external script file modifications
  ! nj_app, nj_srv, nj_log: redesign terminal local echo -- should work when
    TX is not coming from transmit (e.g., captured by a tap)
  ! nj_app: critical fix: check hex editor's selection-empty state before
    submitting selection to the checksum calculator
  ! nj_srv: critical regression fix: LogDocument didn't set m_plugin_jnc in
    the main pluing entry (so opening njlog files always crashed)
  + nj_app: persistency for IAS script file paths
  - nj_app: remove unneeded non-standard resizeMode/layoutMode for plugin list
    widget
  * nj_ias, nj_srv, nj_app: pass file name for IAS compilation for better error
    messages
  * nj_ias: terminate event thread if main thread failed
  * nj_ias: do NOT terminate main thread just because there's main entry point;
    main can do its job and return, event handlers can keep processing events
  - cmake: fix: build with -fno-rtti (llvm and jancy are built with -fno-rtti,
    so ioninja also has to be -- otherwise, can't derive from jnc::EditBase)
  - nj_cmn: fix: remove bogus inline specifier
  + nj_log: add StdRecordCode_Stderr/StdRecordCode_StderrSep (red text)
  - nj_ias: fix: missing import ias_PluginDispatch.jnc could have resulted in
    unresolved import ias.PluginDispatch

  Scripts changelog:

  ! serial-tap-pro: critical fix: ABR was never unabled unless injection switch
    was ON
  ! websocket: critical fix: security-level was essentially ignored (crucial for
    working with certificate-less servers)
  + pcap, tcp-flow-mon, udp-flow-mon: add refresh button to reenumerate pcap
    devices
  + ias: add stock python ias scripts and python api declarations in a stub file
  + tcp-server, tcp-proxy, ssl-server, udp, websocket-server: add refresh button
    to reenumerate network adapters
  + common: add util: enumerateNetworkAdapters()
  + api: add StdRecordCode.Stderr/StdRecordCode.StderrSep
  + common: add 28800 and 76800 as standard bauds
  - modbus-legacy: fix: missing enum cast when cleaning modbus exception flag
  - ez-tap-pro, serial-tap, spi-tap: fix: add-event expressions should use '+=',
    not simple '='

  Ninja Scroll changelog:

  ! njs_log: fix merged attrs for text/hypertext lines -- tail attr on text line
    merge was silently ignored until the next line
  ! njs_term: critical fix: update caret pos on screen buffer switch
  * njs_term: opt: never update caret or repaint inside xterm command handlers
  * njs_term: refactor caret validation impl
  * njs_log: opt: only update tail line attrs for the first merged line
  * njs_hexedit: add assert to getSelectedOffsetRange to prevent misuse

  Jancy changelog:

  ! jnc_ct: new: templated structs, unions, classes, functions, typedefs
  ! jnc_ct: new: support for 'thin' this in struct/union methods
  ! jnc_ct: new: aliases to nested fields
  ! jnc_ct: major redesign of const-correctness & dual type system; 'cmut' is
    replaced by  'constif' and 'const?'
  ! jnc_edit: extract base type (so that we can use the same look-and-feel for
    the python editor in ioninja)
  ! jnc_edit: redesign auto-indent; allow overriding syntax-specific auto-indent
    logic in derived classes
  ! jnc_ct: avoid unconditional gc allocations for temp objects -- a major
    optimization for thin structs
  ! jnc_ct: major refactor: move resolvers from specifiers into relevant
    alternatives (cleaner & increases locality of resolvers)
  ! jnc_ct: major redesign of named type specifier grammar, qualified name
    subsystem, orphan re-anchoring and other modules to support templates
  ! jnc_ct: derive operators from base types
  ! jnc_ct: critical update: support typedef pseudo-recursion (ascend to parent
    namespace)
  ! jnc_ct: new: basetype operator (x.basetype)
  ! jnc_ct: when checking public/protected access, we also must respect which
    namespace was used to access it
  ! jnc_ct: disallow multiple indexer properties (only one per type)
  ! jnc_ct: redesign assert statements; make them conditionally compilable so
    that release builds are not affected
  ! jnc_ct: critical fix: getOffsetUnsafePtrValue didn't finalize the offset
    result value for thin pointers
  ! jnc_ct: critical fix: LlvmPodStruct didn't account for basetypes or paddings
  ! jnc_ct: Value::getLlvmConst now uses mem::isZeroMemory and shortcuts to
    llvm::Constant::getNullValue
  ! jnc_ct: critical update: don't look up in the current nspace before creating
    a named import (always create a named import)
  ! jnc_ct: use static vars when casting consts to pointers when possible
  ! jnc_ct: Type::getZeroValue() now returns ValueKind_Const
  ! jnc_ct: critical fix: for std functions with default arg values, we must use
    createUserFunctionType (otherwise, function type lookup can return existing
    function type without default arg values)
  ! jnc_ct: fix: during name lookup, use shortcut to self only after direct
    children
  ! jnc_ct: allow rvalue -> const* casts
  ! jnc_ct: allow omitting namespace kind in `using` declarations
  ! cmake: critical typo fix: debug info was never used when testing
  ! jnc_ct: critical fix: dynamic cast of variants didn't mark gc roots of cast
    results
  * jnc_ct: add a comment on regexMatch being non-gc root
  * jnc_ct: change getLlvmInstructionString(llvm::Instruction*) to
    getLlvmValueString(llvm::Value*)
  - jnc_ct: fix: incorrect handling of unbalanced closing curly braces in lexer
    during the parse stage
  - jnc_edit: fix: allow empty file name prior to code assist
  * jnc_ct: improve handling of function protypes & overloads
  - jnc_edit, jnc_api, jnc_ct, jnc_mini_ide: remove unused cacheModule
  * jnc_edit: add fileName (code-assist should use it as start dir for import
    search)
  * jnc_ct: allow non-const-integer expressions in code-assist/documentation
  * jnc_ct: make dynamic struct section names internal (!DySection) so that they
    are hidden in item texts
  * jnc_ct: better error processing in qualified_type_name_rslv
  * jnc_ct: qualified_type_name only uses token pos in Mode_Parse
  * jnc_std: move Guid::isEqual impl to c++
  * jnc_ct: generate thin-this default constructors when possible
  * jnc_std: make struct/union methods 'thin' when possible
  - jnc_ct: typo fix: in finalizing autoget value, we passed type modifiers
    instead of ptr flags
  * jnc_ct: make integers nullable
  + jnc_ct: add Field::getParentType
  * jnc_ct: change values of enum StorageKind so that member values form a
    continuous range
  - jnc_ct: opt: remove redundant check for ModuleItemKind_Alias in
    OperatorMgr::getNamespaceMember
  - jnc_ct: remove explicit FunctionType* arg from OperatorMgr::callImpl
  * jnc_ct: ensure layout when setting values to props & vars
  * jnc_ct: loosen up restriction on errorcode types (e.g., allow structs that
    are castable to bool)
  * jnc_ct: add utils: isImplicitCast, isErrorCodeType
  - jnc_ct: fix: casting structs should traverse basetypes (not only direct
    basetypes)
  * jnc_ct: error recovery: check for codegen before calling
    preInitializeStackVariable
  * jnc_ct: only allow CastKind_ImplicitLossyFuntionCall for function ptr casts
  * jnc_ct: allow cast of derived structs/unions to const ptr to base (not
    identity-only)
  - jnc_ct: fix: reset last error in Module::initialize (because
    Module::processCompileError depends on it)
  * jnc_ct: auto-generated getters should have 'const' this
  * jnc_ct: don't unconditionally set 'const' for property getters
  * jnc_ct: refactor type calculations; don't modify Declarator during type
    calculation
  * jnc_ct: Parser::lookupMember should look in base types, too
  * jnc_ct: DerivableType::findDirectChildItemTraverse should resolve import
    base types as needed
  * jnc_ct: Typedef::getNamespace() should resolve import types as needed
  * jnc_ct: Namespace::findItemTraverse should check base types at each step
  + jnc_ct: add Type::getActualTypeIfImport() to peel off imports without
    relying on import fixups -- and use it where applicable
  + jnc_std: add std.getAllocSize
  - jnc_ct: typo fix: setDefaultArgs incorrectly checked for NULL args
  * jnc_ct: fix assert failure call parameters and tweak the
    final message format
  * jnc_ct: add overload to VaribaleMgr::getStaticLiteralVariable
    to account for already-zero-terminated literals
  + jnc_ct: add static literal map for string pool
  * jnc_ct: prefer more conservative ensureSrcPosError to pushSrcPosError
  * jnc_ct: refactor re-anchoring typenames in Parser::postDeclaratorName
  - jnc_ct: fix: respect typename anchors when looking for nested declarator
    typenames
  * jnc_ct: remove getModType wrappers (like getImportIntModType) and call
    getModType directly
  * jnc_ct: major refactor of import types: NamedImportType -> ImportTypeName
  - jnc_ct: fix: Cast_Struct::getCastKind didn't clear m_recursionStopper on
    failure
  - jnc_ct: remove Cast_DataPtr_Lean2Normal::constCast
  * jnc_ct: prevent non-const operators when preparing attribute values
  * jnc_ct: without codegen, don't even bother with preparing operands for casts
    (shortcut to type)
  + jnc_ct: add Module::isConstOperatorOnly/setConstOperatorOnly
  - jnc_ct: fix: constant_integer_expr shouldn't rely on castOperator -- it can
    return pure type in code-assist mode)
  * jnc_ct: add DefaultCopyConstructor and add to for structs/unions when needed
  - jnc_ct: fix: avoid double-constructor when initializing a derivable
  * jnc_ct: don't fallback to 0 without codegen in constant_integer_expr
  - jnc_ct: fix: incorrect assert on multiple returns in unreachable
    (e.g., due to error recovery)
  * jnc_ct: limit rvalue -> const* casts to derivable types only
  * jnc_ct: rvalue -> const* should be of lower priority to avoid ambuguity with
    "proper" pointer casts
  - jnc_ct: remove redundant explicit addr operator in
    OperatorMgr::getNamedTypeMember
  * jnc_ct: remove redundant field m_castOpType from Declarator and FunctionName
  * jnc_ct: replace Parser::checkUnusedAttributes() with postDeclaration()
  - jnc_ct: fix: enum Xxx_FirstXxx should be at the bottom of enum decls
  * jnc_ct: refactor UsingSet, add FriendSet to MemberBlock (used in derivable
    types and properties)
  * jnc_edit: escape html entities in highlightJancySource and use it for
    codetips
  * jnc_api, jnc_rtl: include jnc_ct_Module.h for inlined funcitons
  * jnc_ct: validate data pointers when casting to safe*
  * jnc_ct: require initializers for safe pointer variables
  * jnc_ct: refactor function this-arg-type-flags declaration to allow both pre-
    and post-)
  * jnc_ct: move inline functions to jnc_ct_Module.h
  - jnc_ct: fix: remove double-initialization of FunctionName fields
  * jnc_ct: add OpFlag_KeepDerivableRef to BinOp_Assign (allows to use cast ops)
  * jnc_ct: rename: Pragma__FirstXxx -> Pragma_FirstXxx
  * jnc_edit: use synopsis in auto-completion lists different prefixes)
  - jnc_ct: compat fix: false-vs-NULL
  * jnc_ct: move declaration of ImportTypeFlag_InResolve to api
    (so it's easily sharable)
  * jnc_ct: add ModuleItemContext::getGrandParentNamespace()
  - jnc_ct: fix: recursion was not properly handled when resolving named imports
  - jnc_ct: compat fix: gcc-x86 gives warning on ambiguous
    conversion: sl::String + char + sl::StringRef + char
  - jnc_ct: compat fix: gcc-x86 gives warning on ambiguous conversion: char +
    sl::StringRef + char
  * cmake: use the newly added axl_copy_dlls_for_target & axl_copy_msvc_asan_dll
  * jnc_pch: add support for msvc asan
  - jnc_ct: retro compat fix: llvm::Function::setSubprogram was
    introduced in llvm-3.8
  - jnc_ct: fix: when setting the body of DICompositeType, the underlying MDNode
    can be replaced -- update accordingly
  - jnc_ct: retro compat fix: llvm-3.5, llvm-3.6
  * jnc_ct: split CallConv.h into two (CallConv.h, CallConvKind.h) so that
    FunctionType.h can include only the required minimum
  * jnc_std: use errorcode boundsCheck in std.Array, std.Buffer, std.String
  * jnc_mini_ide: explicitly handle the recently added jnc.global backreference
  * jnc_ct: zero-init list links for std types & std typedefs in debug mode to
    make it look nicer in debugger
  * jnc_api, jnc_ct, jnc_rtl: Type::cmp -> Type::isEqual
  * jnc_ct: opt: inline trivial constructors
  - jnc_ct: remove 'setas' (never used in ioninja and generally is a dubious
    concept)
  * jnc_api, jnc_ct: cleanup ModuleItemFlags
  * jnc_ct: finalize enums & derivable types even in parse mode
  - jnc_ct: fix: enum const shouldnt access the actual int value without codegen
  * jnc_ct: extract shared helper class ModuleItemUsingSet
  * all: simplify: err::setFormatStringError -> err::setError

  AXL changelog:

  ! axl_py: new module axl_py with python wrappers
  ! axl_io: critical fix: failing to remap was putting shmt objects (shared
    memory transport) in a broken state
  + axl_lex: add utility createSrcPosError()
  * axl_lex: change arg types: const err::ErrorHdr* -> const err::ErrorRef& for
    consistency
  - cmake: typo fix: -Wlogical-op-parentheses vs -Wparentheses
  + cmake: add extra named arg RESULT_FRAMEWORK_VERSION to axl_find_lib_dir_ex
  * axl_lex: gcc fix in QtRagelSyntxHighlighteer
  * axl_lex: add utility functions QtRagelSyntaxHighlighter::isLastTokenPrefix,
    isLastTokenSuffix
  * axl_lex: make base of QtRagelSyntaxHighlighter adjustable
  + axl_g: add utility axl_va_list::count<T>(T terminator)
  - axl_sl: fix: cast align factor to target type
  * axl_sl: opt: rewrite getLoBitIdx/getHiBitIdx using compiler intrinsics
  * axl_sl: micro-opt: remove impossible cases from BinTree::xcg
  + axl_abr: add 28800 and 76800 to standard bauds
  + axl_mem: add isZeroMemory(const void*, size_t)

................................................................................

version 5.9.1 (2025-12-11)

  Service release. Introduces new "bare" mode in ioninja-server; layers can now
  have dispatch interfaces and be used in IAS, too.

  Main application changelog:

  ! nj_srv: new bare mode for ioninja-server; allows running ioninja-server
    standalone in CLI mode, without the main app
  ! nj_srv: allow multiple plugin-specific dispatch interfaces within the same
    server process
  - nj_app: non-critical fix: delete vs vs delete[] for m_stdPalette
  + nj_ias, nj_log, nj_cmn: compatibility layer (jancy-1.x vs jancy-2.x)
  - nj_srv: fix: bogus error propagation in Server::connectSession
  - nj_srv: fix: help string should not include <source_file>... because
    ioninja-server accepts options only
  - nj_cmn: fix: SrvMsgCode_UpdateChecksumCalc should not be OOB; also, remove
    unused SrvMsgCode_OobMsg
  - nj_cmn, nj_srv: remove SrvMsg_Load -- unused, we only load() during plugin
    startup
  + hw: add .pof-s for serial-tap-pro-1.1 and serial-tap-pro-1.3

  Scripts changelog:

  ! api: breaking changes: ias.Session -> ias.PluginDispatch (constructor takes
    opaque id); virtual dispatch() moved from doc.Session -> doc.Plugin
  + serial-tap-pro: add dispatch script and classes to .njplg
  * all: update all dispatch classes for the new api
  + add dispatch-variable to plugin files
  - ssl, ssh: fix: cancel resolver on close
  * api: rename in log.RecordFileHdr: m_classGuid -> m_representerGuid and
    m_auxClassCount -> m_auxRepresenterCount; addConverter args: classGuid ->
    representerGuid
  + modbus: new dispatch interface
  * modbus: apply settings on load() -- important for bare mode
  * all: cleanup log record code imports

  Ninja Scroll changelog:

  ! njs_log: add BarePipeline to run convertes/filters/observers without the
    full-scale client/server architecture
  * njs_log: add the default implementation for
    RecordWriter::writeScatterGatherRecord()
  * njs_log: FileRecordWriter should handle buffer overflows and retry writes
  * njs_log: rename: for converters, we also call it representerGuidArray
    instead of classGuidArray
  + njs_log: new log writer: FileRecordWriter (for file streams)

  Jancy changelog:

  * jnc_ct: add jnc.global to refer to the global namespace (like :: in C++)
  * jnc_ct: on errors, JIT throws and gets into an inconsistent state; it's best
    to delete it immediately

  AXL changelog:

  ! axl_io: critical fix: incorrect baud rate setup for termios in modern linux
  + cmake: clang compat: add -Wno-delete-abstract-non-virtual-dtor,
    -Wno-parentheses to shut down useless warnings
  + cmake: add helper macros axl_copy_dlls_for_target, axl_copy_msvc_asan_dll
    and use those
  + axl_pch, cmake: add support for msvc asan; auto-detect asan dll path and add
    it to cache

................................................................................

version 5.9.0 (2025-10-31)

  Major update. Introduces automatic baud rate detection in Serial Tap Pro,
  layered log files, hiliting selecting records when in the detailed-view mode,
  checksum calculator now works in transmit pane, dynamic attributes and
  dynamic bitfields in Jancy dynamic layouts (used to calculate & show absolute
  addresses of registers and coils in Modbus Analyzer).

  Main application changelog:

  ! nj_cmn, nj_app, nj_srv: major update: layered logs + saving original log
    (with layers stripped)
  ! nj_io_abr: new io_abr.jncx -- auto baud rate detection library
  ! nj_app, nj_srv: hilite selected records when in detailed view mode (pcap,
    ethernet tap)
  ! nj_app, nj_srv, nj_log: run checksum calc on hex editor selections in
    transmit pane
  ! nj_ias: run a loop of re-layouts for dynamic layouts (layout, resize,
    autorun, etc)
  ! nj_ias: packet templates: add support for dynamic bitfields
  ! nj_ias: add support for dynamic array index display names (indexFormatFunc)
  + nj_hwc: add support for overriding FPGA rpd base index
  * cmake: on unix, put dynamic libs together with executables
  - nj_app: fix: process DPI change for detail log widget, too
  * nj_app: save editor before executing autorun actions

  Scripts changelog:

  ! serial-tap-pro: auto baud rate detection
  ! all: use jnc.EnumType.getValueName or jnc.EnumType getValueString depending
    on context (name-only for digests, code-plus-name for details)
  ! common: fpga uploader: critical fix: proper checks for all FPGA status error
    flags
  + proto: arp should use 0x%04X format for protocol-type field
  * hid, hidmon  make use of the newly added usage page string properties (i.e.,
    m_name/m_string/m_enumString)
  * serial-tap-pro: two-staged update 1.1 -> 1.2 -> 1.3
  + common: iox.FpgaUploader: expose getVersion(io.UsbDevice*)
  - common: iox.FpgaUploader.update shouldn't write log error to avoid double
    error in log (calling session writes error to log anyway)
  + common: iox.FpgaUploader: add option to allow upload without version check
  + i2c-spi-tap, ethernet-tap: chop rpds at 84000
  + layers: add guid to pure layers (so that they can be added to new layered
    logs)
  * serial-tap-pro: flip TX/RX overflow flags (TX/D1 first, RX/D2 second)
  * tcp-ip: update packet field display types and format-specs
  - serial-tap-pro: fix: ignore break conditions when handling line change
    notification
  + common: support dynamic bitfields in log.representDynamicLayout
  * modbus: use the newly added dynamic bitfields to layout discrete inputs and
    coils
  + modus: show modbus register addresses where applicable
  + common: log.representDynamicLayout now supports dynamic array index display
    names (indexFormatFunc)
  * modbus: port: use dynamic attributes in dylaouts instead of (removed now)
    setGroupAttribute

  Ninja Scroll changelog:

  ! njs_log: major update: "layered" record files
  ! njs_log: critical fix: use-after-free in CacheMgr::cancelAsyncOp
  + njs_log: add ScopeReadLock/ScopeWriteLock; refactor createLayeredRecordFile
    using ScopeReadLock
  * njs_log: remove range hilites (not used anyway), add line hilites - will be
    used to show "selected" records in ioninja

  Jancy changelog:

  ! jnc_ct: major update: add support for dynamic attributes for all fields and
    groups of dynamic layouts
  ! jnc_ct, jnc_rtl: add support for dynamic bitfields in dynamic layouts
  ! graco: major update: inline resolvers (cleaner & better locality)
  ! jnc_ct: critical fix: do not auto-prepare attribute values on fetch - this
    can only be done at compile stage!
  + jnc_io_hid: add io.HidPage.m_enumString, io.HidPage.getUsageEnumString as
    extension (useful helpers to provide the same string format as enums)
  + jnc_io_hid: add io.HidPage.m_string, io.HidPage.getUsageString reflecting
    latest axl_io_hid changes
  + jnc_ct, jnc_rtl: add EnumType.getValueName() -- useful for digests and/or
    condensed descriptions
  + llk: api: support for dynamic symbol pushing (for semantic-driven syntax)
  * jnc_ct: llvm-19, llvm-20 compatibility fixes
  * jnc_ct: opt: Value::getLlvmConst is now using a typeKind-driven function
    table instead of switch
  * cmake: remove touch_if_changed; use axl_touch_if_changed instead
  * jnc_ct: prepare attribute values for compiled functions (required for packet
    templates in ioninja)
  - jnc_ct: fix: Module didn't clear attribute & attribute block list
  * jnc_ct: move Function::require() to .cpp (makes no sense to inline it)
  * jnc_rtl, jnc_ct: getValueString for enums should include numerical value
  * jnc_ct: respect modifiers bigendian and volatile for autoget properties
  + jnc_api: export methods of jnc.DynamicSection: getSize, getBitOffset,
    getBitCount, updateGroupSizes
  * jnc_rtl: opt: only mark variant value for dynamic attributes
  - jnc_rtl: remove unused rtl::Attribute::m_dynamicAttributeBlock
  - jnc_rtl: fix: incorrect assert: when not saving, dynamic section array in
    dylayout is always empty
  * jnc_ct: move JIT source code to a dedicated dir/group jnc_ct_Jit

  AXL changelog:

  ! axl_abr: new library: axl_abr (automatic baud rate detection)
  + axl_io_hid: add UsagePage methods: getString/getUsageString
  + axl_io: add SimpleMappedFile::unmapAndSetFileSize(uint64_t)
  + cmake: add axl_touch_if_changed

................................................................................

version 5.8.2 (2025-07-18)

  Service release.

  Main application changelog:

  ! nj_srv: add jancy USB exception for serial-tap-pro VID:PID (to allow GUEST
    and all other accounts to use Serial Tap Pro)
  + conf: add serial-tap-pro capability

  Scripts changelog:

  + serial-tap-pro: add help page (F1 in serial tap pro plugin should lead to
    the hardware manual page)

................................................................................

version 5.8.1 (2025-07-15)

  Service release.

  Main application changelog:

  ! nj_app: terminal: add support for UTF8 & SGR mouse report encodings

  Scripts changelog:

  ! serial-tap-pro: critical fix: when syncing with system time, account for
    device time delta (timestamp precision loss otherwise)
  * serial-tap-pro: update fpga firmware

  Ninja Scroll changelog:

  * njs_term: support DECSET modes 1005, 1006, 1015 (mouse report encodings)

  Jancy changelog:

  - jnc_io_usb: fix: io.enumerateUsbDevicesNoDesc() shouldn't be `errorcode`
  * test: update ioninja scripts, add serial-tap-pro test

................................................................................

version 5.8.0 (2025-07-11)

  Major update with support for Serial Tap Pro.

  Main application changelog:

  ! nj_srv: critical fix: release LLVM objects before exiting Server::run cause
    at_exit(llvm_shutdown) can be called earlier than our axl module finalizers
    leading to crash at exit (easily triggered on macOS arm64)
  + nj_app: reset terminal on connect
  - nj_app: fix: in terminal, don't feed mouse events to njs::TerminalWidget
    if we are already tracking mouse (this could lead to "sticky" selection)
  - njs_log: fix: terminal frame should have a regular icon (not 16x16 pixmap)
  * nj_ias_srv: wait for main thread before releasing runtime & module
  * nj_app: mac: use monospaced font for status bar panes (on macos they use
    fonts with proportional digits, so line/col numbers used to jump around)
  - nj_app: mac: fix non-modal dialog issues (z-order, focus)
  + nj_app: mac: add "New Window" to dock menu
  - package: win: don't install msvc10 runtime (all dependcies are now built
    on msvc15)

  Hardware client changelog:

  ! nj_hwc: add support for Serial Tap Pro
  * nj_hwc: don't shortcut to UsbDevice::open(vendorId, productId) -- this
    hides the actual error. instead, use the full path (enumerate, find, open)

  Scripts changelog:

  ! serial-tap-pro: new plugin for Serial Tap Pro
  * ias: update all stock script to use receive instead of onLogRecord
  + serial: mac: new setting: update interval -- for polling status lines

  Ninja Scroll changelog:

  ! njs_log: major contention optimization -- reduce contention by locking once
    and buffering multiple records at a time (instead of per-record locking)
  ! njs_log: critical fix: incorrect ordering of filters & converters
  * njs_term: clean-up reset operations: softReset(), resetKeepContents(),
    fullReset()
  - njs_term: xterm compatibility fix: handling of character at the EOL
  - njs_term: xterm compatibility fix: handling BS at BOL
  - njs_log: fix: invalidateRegexMarkup didn't handle the last bin zone properly
  - njs_log: fix: calculate original log position before skipping hidden records
    this could lead to incorrect indexing progress reports (e.g., stuck at 99%)

  Jancy changelog:

  ! jnc_rt: critical update: collect right after running destructors in destruct
    thread -- this prevents pending-free memory buildup in memory-hungry scripts
  * jnc_ct: automatically apply `typeof` operator for type values in attributes
  - jnc_ct: fix: process null-ptr in Cast_String_FromArray::constCast
  + jnc_io_base: mac: (optionally) use kqueue for IO multiplexing in io.Serial
  + jnc_api: add methods: AutoModule::release, AutoRuntime::release
  * jnc_rt: opt: avoid registering mutator thread in the tight loop in
    GcHeap::runDestructCycle_l
  - jnc_rt: remove JNC_CHECK_STACK_PRECEDENCE asserts
  + jnc_api: add setjmp/longjmp implementation for win arm64 (using armasm64)
  * jnc_api, cmake: use cmake native ASM support (ASM_NASM/ASM_MARMASM)

  AXL changelog:

  + axl_sys: new class: sys::drw::Kqueue
  * cmake: make use of FindWDK.cmake when searching for WDK dirs
  * cmake: use CMAKE_GENERATOR_PLATFORM and CMAKE_CXX_COMPILER_ARCHITECTURE_ID
    when detecting target cpu

................................................................................

version 5.7.5 (2025-06-12)

  Service release.

  Main application changelog:

  ! nj_srv: critical fix: enter wait region before adding sync params (possible
    abortThrow in enterWaitRegion)
  ! nj_app: major update: make Find dialog and Regex Markup dialog non-modal
  ! nj_srv: critical fix: respect default log filter settings on startup
  - nj_app: fix: incorrect file transmit wait logic (on not fully transferred
    block the file transmit went to the wait state even if the session never
    explicitly disabled transmit
  * nj_app: adjust dialog styles on linux (close button was missing on wayland)
  - conf: remove modbus-legacy from the list of official plugins; keep the
    sources for reference/sample
  * nj_app: use 64-bit timeval-to-timestamp
  + nj_app: handle perpetual licenses in the app token
  * nj_app: update view-log-as-icon according to the actual bin-view-kind of the
    current document
  * nj_log: opt: detailizer shouldn't look up record db for std records
  - nj_app: fix: maintain stick-to-bottom toolbar button state even if log is
    not focused
  * nj_srv: include IAS when calculating GC stats, applying GC triggers, and
    force-collecting
  + nj_app, nj_srv: add new message: RebuildLogIndex (when we change bin-view
    hex-view to plain-text, we don't need to rebuild filters or converters)
  * nj_app, nj_srv: don't segregate GC stats -- accumulate stats from all the
    plugins for report
  - nj_app: fix: regex markup pattern page cleared regex attr on save
  - nj_ui_srv: fix: QT group boxes are checked by default -- Jancy properties
    should reflect that
  + nj_log: add std records for 9-bit binary data (Bin9) and non-mergeable
    binary data (BinSep)
  - nj_log: typo fix: invalid std record code prefix mask
  * nj_app: add sanity-checks in FindDlg::onRangeProcessCompleted and
    FindDlg::onRangeProcessProgress
  * nj_log: sanitize std record codes in range processors
  - nj_srv, nj_ias: clear RX buffer before starting the script, not after
    compilation. also, clear RX buffer on clear-log
  - nj_ui: fix: ui.GroupBox didn't call bindable event when setting m_isChecked
  - nj_app: fix: dictionary widget modification tracking
  - nj_app: fix: dictionary widget must close current editor before deleting
    items
  * nj_srv: reimplement dispatch to make it possible to call from the main
    thread too (useful for layer-to-session interactions)
  - nj_app: fix: add special handling for saving an empty log

  Hardware client changelog:

  * ioninja-hwc: clear BREAK condition on serial open (on Linux/macOS BREAK
    could be lingering from before depending on the driver)

  Scripts changelog:

  ! usbmon: critical fix: handle truncated captures
  ! common: host-name resolver should prefer IPv4 unless specified otherwise
  ! common: add SslPropertySet.m_securityLevelProp (critical to enable SSL
    servers without certificates for testing)
  ! api: critical fix: transmitAll() stopped after first buffer overflow
  ! api: introduce doc.sessionDispatch for layer <-> session interaction
  - ssh-serial: typo fix: SerialLogRecordCode.RtsChanged ->
    SerialLogRecordCode.BreakConditionChanged
  * ssh-serial: if requested, enable BREAK after connection with ioninja-hwc has
    been established (and mark it in log)
  * serial: if requested, enable BREAK after open (and mark it in log)
  * serial, ssh-serial: disable transmission when BREAK is on
  * i2c-spi-tap, session-wizard: resize name column to contents
  + hidmon: new property: snapshot size on windows (for USBPcap)
  - hidmon: remove unnecessary isochronous transfer handling
  * bacnet: add to the "analyzers" group
  + usbmon: new property: snapshot size on windows (for USBPcap)
  - usbmon: fix: handle m_transferType -1 (not an error and can happen in real
    captures)
  * websocket, modbus-gateway, tcp, udp, ssl, ssh: use iox.HostNameResolver
  * api: update ColorFlags in accordance with njscroll (two bits are reserved
    for regex markup)
  * ssl-server: separate TCP and SSL properties
  - api: fix: invalid values for LineAttrFlags.Override, LineAttrFlags.TileIcon
  * ssl-connection, ssl-server: apply the newly added property
    ui.SslPropertySet.m_securityLevelProp
  - usbmon: fix: save and restore currently selected device
  - usb-endpoint: fix: m_deviceCombo.m_currentData holds
    io.UsbDeviceEntry const*, not io.UsbDevice const*
  + log: add StdRecordCodeAwareness for auto-handling BinSep and Bin9 in user
    scripts
  * common: toggle can work without a dedicated group property (e.g., a filter
    layer)
  + api: add method: ui.FormLayout.addLabel
  - websocket-client: fix: invalid ws/wss address regex
  * serial: update log filter UI to use the new ui.ToggleUi
  * common: rename ui.LogRecordCodeFilterUi -> ToggleUi
  - common: remove unused ui.StdSessionInfoSet.onLogRecord
  * common: move string utils to stringUtils.jnc and use it throughout plugins

  Ninja Scroll changelog:

  ! njs_log: major update: redesign indexing/conversion progress tracking using
    the conversion map file (mapping indexes of the original and final files in
    the conversion chain)
  ! njs_log: critical fix: check for mergeable-forward flag before emitting
    pending CUs for the prev line
  ! njs_log: critical fix: BinZone m_firstLine/m_lastLine could end up being
    dangling pointers for bin-text
  ! njs_log: critical fix: IndexLeafCache::IndexLeafCache(IndexLeafPtr leaf)
    didn't handle NULL leaf properly
  ! njs_log: critical fix: in onRepresentPageCompleted, don't touch the page
    after the critical point (beyond which page can be a dangling pointer)
  ! njs_log: redesign processing of pre- and post- delimiters so that a match
    hiding inside a UTF-8 char produces correct results
  ! njs_log: critical fix: reset regex markup state on new zones
  ! njs_log: critical fix: pending cus emission could advance the current line;
    save it for eof markup
  ! njs_log: critical fix: trailing bin-zones could be beyond end-of-page; stop
    right there
  ! njs_log: critical fix: clear markup state for pages without lines (a page
    created but not represented yet)
  ! njs_log: major update: redesign of observers; now they are called for the
    final file in the conversion chain
  ! njs_log: critical fix: foldflag was using 4 times more space than needed
    (uint8_t vs uint32_t)
  ! njs_log: major update: redesign of index nodes
  - njs_log: warning fix: uint64_t -> size_t conversion on 32-bit platforms
  * njs_log: make use of the new axl_re2 scatter-gather api
  * njs_log: improve regex markup on page boundaries: process dynamic eof for
    the tail zone
  * njs_log: delay reporting of index progress as to avoid progressbar
    flickering
  - njs_log: fix: when moving hex-view-line -> non-hex-view-line, we still have
    to redraw the original line (to erase the byte-box)
  * njs_log: introduce RegexMarkupAttr::m_delimiterColor and a new flag
    RegexMarkupColorFlag_PostDelimiter to denote pre- and post-delimiters
  - njs_log: remove dual delimiter attrs (never to be used)
  * njs_cmn: reserve two more bits for color flags (at expense of index mask)
  * njs_log: don't update m_markupFirstOffset after the first zone break
  * njs_app: add trimRecordFile (could be useful for debugging problematic logs)
  * njs_log: tighten asserts -- regex markup functions should never get
    prev-page-merge-line as anchor-line
  * njs_log: skip the prev-page-merge-line binzone -- if not merged to "real"
    lines due to emit-pending-cus
  * njs_log: move partCode from line to BinZone (only used to locate
    next-bin-line for bin-hyperlinks)
  * njs_log: opt: reduce switch in range-processors (we fold Bin9 to Bin)

  Device Monitor changelog:

  ! dm_lkm: critical fix: clear off flags from TTBR1_EL1 before physical
    to virtual address translation
  - dm_lkm: compatibility fix: don't clear X86_CR4_CET before linux-5.18

  Jancy changelog:

  ! jnc_ct: opt: cast char array attributes to strings at compile time
  ! jnc_rtl: critical fix: rtl items cache accesses should be atomic; otherwise,
    prone to to leaks
  ! jnc_ct: critical fix: char tokens and line tokens should use
    Token::m_data::m_int64 (not m_data::m_integer!)
  ! jnc_io_base: posix: clear flow-control before issuing TIOCSBRK (which
    otherwise could be blocking); restore flow-control after TIOCCBRK
  - jnc_ct: fix: conversion from char-array to string should use the actual sz
    length (not the length of array)
  * jnc_ct: declof operator should prepare attribute values
  * jnc_ct: inline Function::require and Module::markForCompile
  * jnc_io_usbmon: updates re latest axl_io_usbmon changes
  - jnc_io_base: fix: handle IP6 family jnc-vs-platform value discrepancy
    in io.HostNameResolver
  * jnc_ct: cleanup ABI underscore handling in Jit::findSymbold
  * jnc_io_usb: link to security framework (libusb requires it on mac)
  - jnc_ct: fix: missing value kind string for ValueKind_Field
  - jnc_rt: fix: invalid calculation for GC freed memory size
  * jnc_rt: change collection trigger so that it doesn't fire right away
  - jnc_rt: fix: destruct objects in batches
  - jnc_rt: fix: m_stats.m_currentAllocSize was calculated incorrectly
  + jnc_api: add create-func to VariantFuncTable
  * jnc_ct: use newly added data-ptr-to-const methods in cast operators
  * jnc_ct: add new methods to OperatorMgr for creating data ptrs to consts
    both at compile-time and run-time
  * jnc_ct: opt: avoid unnecessary allocation in
    Value::setCharArray(const sl::StringRef&) due to string.sz()
  * jnc_rt: set error when current thread has no TLS
  * jnc_ct: add asserts for checking that we only save consts at compile-time
  + jnc_rt: add initializer param to all allocator methods
  + jnc_api: add jnc::GcStats::add()
  + jnc_io_ssl: add io.Ssl.m_securityLevel
  - jnc_rtl: typo fix: RegexMatch -> RegexCapture
  * jnc_io_usbmon: on linux, only build it if pcap is present
  * sphinx: use raw literal for the identifier regex

  AXL changelog:

  ! axl_io: critical fix: io::Serial on POSIX should clear CMSPAR for Odd & Even
    parities (CMSPAR can stick from before resulting in Odd acting as Mark and
    Even as Space)
  ! axl_re2: add scatter-gather api
  ! axl_io_usbmon: critical fix: handle truncated packets
  ! axl_io_usbmon: critical fix: on linux, incorrect calculation of original
    data size for isochronous transfers (hence, runtime errors)
  * axl_io: on POSIX, set RTS when RTS/CTS flow control is enabled (otherwise,
    both sides with RTS/CTS flow control could wait for CTS forever)
  * axl_io: on macos, there's no CMSPAR -- handle it properly
  * axl_io_usbmon: set m_transferType to -1 for USBPCAP_TRANSFER_IRP_INFO &
    USBPCAP_TRANSFER_UNKNOWN
  * axl_glibc: split the axl_glibc wrapper library into two: libc vs libm
  + axl_io_ssl: add getSecurityLevel/setSecurityLevel when on openssl-1.1.0 or
    later
  * cmake: print sysroot if any
  * axl_io_usbmon: on linux, only can build it if pcap is present

................................................................................

version 5.7.4 (2025-03-30)

  Service release.

  Main application changelog:

  ! nj_app, nj_cmn: add support for context help on F1 (use plugin help pages,
    fallback to user-manual)
  + nj_app: add default extension when saving files on Linux
  * nj_app: force xcb on linux (QT5 on wayland is extremely buggy)
  + nj_log: add non-mergeable variants of TX, RX, Bin, Text, etc
  * nj_log: standard log representor and log record code DB should ignore
    PartCodeFlag_Mergeable -- there now could be families of similar record
    codes
  + njs_log: add overload for Representation::addPart with 2 data blocks
  - nj_app: fix: copying from the Text transmit pane was always setting njs-bin
    to full text ignoring the selection
  - nj_app: fix: use QDialog::Accepted when completing SaveLogRange
  + conf: add log-layer-removal.conf (for njslogmgr --remove-layers)
  + nj_app: allow adding pure layers to log documents via "Open plugin" or
    toolbar dropdown (before it only worked via the modal "Add Layer" dialog)
  * conf: change download-base-url -> https://ioninja.com/downloads/

  Scripts changelog:

  ! log: add record codes and methods for 9-bit data
  ! all: add page and help URLs to support context help on F1
  * modbus: rename fields according to the official modbus.org specification
  * modbus: use decimal notation for addresses
  * modbus: show expected CRC/LRC checksum values
  + common: implement reconnect functionality in iox.SshChannel
  * process: minor stylistic change: use log.PartCodeFlags.Mergeable in
    ProcessLogRecordCode.Stderr
  + api: add non-mergeable std record codes (Tx/Rx/Text/Bin/etc)
  + ssh-serial-tap: handle serial line error HWC messages
  * ssh-serial-tap: exclude non CTS/DSR line change HWC messages
  - modbus: fix: invalid log GUID (legacy modbus log)
  - ssh-serial-tap: typo fix: io.HwcMsgCode.SerialTapRtsDtr handler was using
    m_statusLines for mask calculation
  * ssh-serial-tap: reset status & control lines on start-capture
  * common: initialize SshChannel.ConnectParams with defaults; check for
    non-existing properties inside SshChannel.initConnectParams

  Ninja Scroll changelog:

  ! njs_log: major update: native support for 9-bit data in the engine
  ! njs_log: major update: emit pending CUs at the end of bin-text zones
  ! njs_term: when dropping history lines due to history limit, adjust the
    selection and scroll position naturally
  * njs_log: for foldable records, set the first line index when we actually
    add the first line
  * njs_log: MergeCriteria.forceBreak should not lose the last part kind
  * njs_log: remove redundant setBinDataConfig (IndexMgr::create receives the
    same BinDataConfig)
  * njs_log: override checker pos to -1 for continuation bin-text lines
  + njs_log: new: HardDelimiter (to separate lines like it's a new record)
  + njs_log: new flag to make visual attributes of the added part "local"
    (otherwise, will be propagated)
  * njs_log: propagate representer attrs to the next line for bin-text lines
  * nj_log, nj_app: add --remove-layers option to remove layer-added log records
    could be helpful to restore raw log from modbus log

  Jancy changelog:

  ! jnc_ct: require destructors and vtable functions
  * jnc_ct: minor update to add support for llvm-19
  - jnc_ct: fix: cmp operators should have OpFlag_EnsurePtrTargetLayout and
    OpFlag_ArrayRefToPtr

  AXL changelog:

  ! axl_sl: major update: refactor & optimize sl::BitMap; add new functions and
    methods: findBitReverse/findZeroBitReverse, shlBitMap/shrBitMap
  - cmake: fix: don't build axl_io_hid unless RAGEL is found (we use RAGEL to
    parse hiddb)
  + axl_g: add new define: AXL_PTR_POW (power of two to get AXL_PTR_SIZE)

................................................................................

version 5.7.3 (2025-01-16)

  Service release.

  Main application changelog:

  - nj_srv: fix: deregister log plugins if layer compilation fails (otherwise,
    record codes remain unavailable even after loading a correct layer)
  + nj_app: add status to the find dialog and update it accordingly (pattern not
    found, wrapped past end-of-log, wrapped past begin-of-log)
  + nj_app: add confirmations (exit, clear log, close session, reset terminal)

  Scripts changelog:

  ! ssh: critical typo fix: iox.SshChannel.ConnectParams.m_ptyHeight vs
    m_ptyWidth
  * modbus: print registers in both hexadecimal and decimal in log
  + log: add hyperlinks to elements arrays of derivable types (so that we can
    select the whole field)
  - common: fix: in log.representDynamicLayout, each array element hyperlink
    should use elementSize
  * modbus: use uppercase hex for addresses
  * usb-endpoint: use uppercase hex when setting control values from dispatch

  Ninja Scroll changelog:

  ! njs_log: critical fix: pending async ops were not deleted after completion
    thus slowly polluting cache-mgr over time
  ! njs_log: critical fix: when resuming async ops, nullify page ptr before
    potential cancelAsyncOp
  - njs_log: fix: copy with timestamp for multi-line text blocks worked
    incorrectly. also, trim padding if a line has no contents
  + njs_log: add RangeProcessCompletionStatus_FinishedPostWrap to detect wraps
  * njs_cmn_wdg: copy-as-jancy-hex-literal now uses multi-line literals
  * njs_cmn_wdg: chop the trailing whitespace in copy-as-c-array

  AXL changelog:

  + axl_sl: add convenient overloads: sl::String::trimLeft/trimRight (const
    StringRef& charSet)
  - axl_err: opt: ErrorRef::getDescription should retrun sl::StringRef, not
    sl::String

................................................................................

version 5.7.2 (2024-12-31)

  Service release. Introduces: expand/collapse log, size- and time-based file
  splitting in ioninja-hwc, multiline formatting literals and other multiline
  literal improvemtns in jancy, errorcode properties in jancy, transmit mode
  in HID, handling serial setting errors in all serial-based plugins, USBPcap
  BSOD workaround, multiple other critical fixes.

  Main application changelog:

  ! nj_app: new: expand/collapse all records in the log
  ! nj_app: critical fix: under certain circumstances, QT can delete the active
    MDI document without activating next MDI window first (could cause crashes)
  * nj_app: undo the default 100 pix minimum column width in dictionary widgets
  - nj_app: fix: the information pane used wrong property manager; as a result,
    read-only editors for the information pane items were not shown
  - nj_app: fix: don't show (EVALUATION) when subscription is enabled

  Hardware client changelog:

  ! nj_hwc: add support for output file splitting based on size or time

  Scripts changelog:

  ! hid: new: transmit mode (send as output/feature)
  ! usbmon, hidmon: critical fix: incorrect USB transfer capture buffer
    processing when transfers are split between multiple read blocks
  ! usbmon, hidmon: don't allow changing kernel buffer size on windows after
    open (usbpcap can BSOD due to buffer size decrease)
  ! serial: when can't change serial settings, push appropriate error string
    and restore serial UI
  ! pipemon, mailslotmon: critical fix: MonitorFilter.setFilter was throwing
    an exception on empty wildcard; instead, empty wildcard should set filter
    to "None"
  * hid: save the device usage page/usage and respect it when restoring device
    selection
  + hid: add usage & usage page values to log & tooltips
  - usb-endpoint: remove dispatch code OpenDeviceVidPid (use OpenDevice with an
    extra parameter for the this)
  + hid: add dispatch interface -- now HID can be controlled by in-app scripts
  - hid: fix: update the serial-number info line for consistency with others
  * hid: use &nbsp; in the HID info tooltip to prevent unwanted line breaks
  + api: new utility method: ui.BoxLayout.addLabel(string_t) and use it
    everywhere
  - usbmon, hidmon: remove the ReadParallelism setting (as it's removed from
    io_hid.jncx)
  * all: trivial: convention: error strings are lowercase
  + common: add 5 & 6 bits to the serial data-bits combo
  + serial-ui, serial-log: add support for parity: Ignore
  * serial-tap: trivial: remove separator in the menu before Filp DTE/DCE

  Ninja Scroll changelog:

  ! njs_log: critical fix: clear up font flags and text color when setting the
    line attribute - we don't want the attributes of the initial part auto-
    applied to the rest of the line
  - njs_log: fix: don't clear stick-to-bottom when scrollContentsBy() is
    triggered by setLineCount() from updateUi() or representPage()
  + njs_log: add Server::expandCollsapseAll (use a simple ConstFoldingFilter)
  + nj_log_cmn: add support for updating file size on close ("off" by default,
    but it could make sense to change it to "on" later)

  QT Property Browser changelog:

  * qtpb: set the minimum value column size to 32 (instead of default 100)
  * qtpb: use the default GUI font for property grid (orginally, it could use
    some other font assigned by a QT style to tree widgets)

  Jancy changelog:

  ! jnc_api: critical fix: constructing string_t with length had an off-by-one
    error
  ! jnc_io_usbmon: critical update: remove property m_readParallelism;
    parallelism is inherently windows-only, and USBPcap doesn't handle multiple
    IRP_MJ_READ-s properly (can complete them out-of-order)
  ! jnc_io_usbmon: critical fix: maintain context of the transfer parser
  ! jnc_io_usbmon: critical update: prevent changing kernel buffer size when on
    windows; USBPcap has a bug causing BSODs on decreasing the buffer size
  ! jnc_ct: add support for errorcode properties (errorcode applies to setters)
  ! jnc_ct: critical fix: bitwise OR and XOR operators worked incorrectly for
    int8_t/int16_t -derived bitflag enums
  ! jnc_ct, jnc_edit: major update: multiline and formatting literals redesign:
    support multiline formatting literals, add the ${...} syntax, common indent
    handling improvements
  - jnc_ct: fix: Module::initialize() yielded compile errors with ASAN
  - jnc_io_hid: fix: sendFeatureReport() accepts `void const*`
  + jnc_std: add std.pushError/pushErrno
  * jnc_io_xxx: add `errorcode` to appropriate properties
  - jnc_io_websocket: fix: setExtraHeaders() should return void
  - jnc_io_usbmon: fix: handle setKernelBufferSize when not opened
  * jnc_io_usb: set errors when returning false
  * jnc_io_pcap: properties now return false instead of throw
  + jnc_ct: add __LINE__ token (to complement __FILE__)

  AXL changelog:

  * axl_io_hid: trivial: use uppercase hex for non-standard usages
  + axl_io_usbmon: add typedef axl::io::UsbMonTransferParser; maps to UsbPcap on
    windows and UsbMon on linux
  - axl_io_usbmon: fix: clearFilter was implemented incorrectly (caused stopping
    the capture instead of removing the filter)

................................................................................

version 5.7.1 (2024-10-09)

  Service release.

  Main application changelog:

  - nj_app: regression fix: QT "macintosh" style used incorrect tab control text
    placement
  - nj_app: regression fix: non-number character prefixes should be skipped when
    parsing packet template number fields

................................................................................

version 5.7.0 (2024-09-26)

  Major update. Introduces the UI theming support, support for encoded fields
  in the packet template engine, a critical update for the kernel module of the
  Device Monitor for Linux re Intel CET, reactive statements in Jancy reactors.

  Main application changelog:

  ! nj_app: new UI style & color theme managment
  ! nj_app, nj_ias: support for encoded fields in packet templates (via the new
    ias.FieldCodec interface)
  ! nj_app: regession fix: session menus were not removed on deactivate
  ! nj_app, nj_ui: major update: PropertyGrid is now creatable by scripts
  ! nj_app: new UI for the stick-to-bottom functionality
  ! nj_app: copy-bin and save-bin-as-file can run on multi-zone selections now
  * nj_ias: apply 1MB packet size limit for dynamic layouts
  * nj_app: limit the max number of properties in the packet template widget
    (QtPropertyBrowser is not efficient enought and can't handle too many)
  - nj_app: fix: escape newlines in regexes (otherwise the multi-regex markup
    page could look distorted)
  + nj_app: add the new stick-to-bottom menu item and toolbar icon and update
    them according to the stickToBottomChanged signal
  * nj_app: remove icons from regex markup pattern page (look off in dark mode)
  * nj_ias: create actions for stringified items
  * nj_srv: save first compile error (otherwise, it could be lost if it doesn't
    terminate the compilation)
  + nj_app: add support for "opaque" properties (i.e., label + edit button)

  Scripts changelog:

  ! bacnet: new BACnet MS/TP Analyzer plugin
  ! api: major update: support for encoded fields via the new ias.FieldCodec
    interface and the common utility log.representDynamicLayout
  ! api: ui.PropertyGrid is now derived from ui.Widget and can be used in UI
    forms
  ! hid: major update of HID output & feature report UI
  + devmon, serialmon, pipemon: add a special record code (with a KB link) for
    when tdevmon is not detected
  + hidmon, usbmon: add a special record code (with a KB link) for when usbmon
    is not detected
  * usb, usbmon: change device name format: remove manufacturer (for consistency
    with HID)
  * hid, hidmon: change device name format: include interface number, remove
    manufacturer (too long otherwise)
  * usbmon, hidmon, serialmon: detect the presence of the underlying capturing
    service and update UI accordingly
  + nj_app: allow copy-bin and save-bin-as-file on multiple binary blocks
  + serial: add extended port info into the open-port log records
  + serialmon: add extended port info into the start-capture log records
  * hid: include report IDs into log records
  * hid: include interface id into the device name
  * hid: only show field indexes where relevant
  + api: new methods: ui.ComboBox.insertSeparator()
  - net-sniffer-log: minor fix: detail log attributes (important for dark
    themes)
  - serial: fix: status/control line filter control labels & tooltips
  * common: formatFunc should be ToStringEx (can potentially accept size and
    decl)
  + common: add COBS-encoding (for BAC net) and block XOR-ing
  + modbus: add packet templates for Modbus ASCII (via the new encoded fields)
  + common: add encodeHexString
  * common: fix decodeHexString buffer alloc size; decode now allows using
    [.,* :] as separators too
  + pcap: add support for io.PcapLinkType.Raw (raw IPv4/IPv6)
  * hid: when writing report to the log, don't write more bytes of payload than
    the report defines
  + hid: add support for get-feature reports
  - hid: fix the form layout for multi-field reports
  - wizards: remove name of the root group in protocol analyzer

  Ninja Scroll changelog:

  ! njs_log: use the new bin-text rendition (both for hex-view and plain-text)
    when saving log as text
  ! njs_cmn, njs_log: redesign copy-bin (should also work for multiple binary
    zones)
  * njs_cmn, njs_log: respect log widget hex-case setting when saving log as
    text
  - njs_cmn_wdg: fix: LineWidget::changeEvent should call the base handler
  * njs_log, njs_cmn: extract a portion of bin-text encoding and counting code
    to the common library
  * njs_cmn: use space instead of HorizontalLineLeftChar for tabs (apparently,
    that glyph was missing in a few common monospace fonts)
  + njs_log: add support for master hyperlinks (\e$...) to trigger when cursor
    enter the line

  Device Monitor changelog:

  ! dm_lkm: x86: respect X86_CR4_CET and clear it before accessing X86_CR0_WP
  ! dm_lkm: x86: add a new method of write protection removal via PTEs
  - dm_lkm: warning fix: add `static` to djb2
  + dm_lib: add dm::Monitor::isLoaded to check for the presence of tdevmon

  QT Property Browser changelog:

  + qtpb: add QtTreePropertyBrowser::viewportSizeHint() and use it when
    calculating default widget size
  - qtpb: fix: clear the private pointer from treeitem delegates on destruction
  + qtpb: add QtTreePropertyBrowser::applyStyleFix(), call it on style change
  + qtpb: add QtBoolPropertyManager::resetIcons(), updateAllProperties()
    these are required when changing themes

  Jancy changelog:

  ! jnc_ct, jnc_rtl: major update: reactor redesign to support reactive if-else
    and switch statements
  ! jnc_ct: major update: declof operator (so we can get jnc.ModuleItem* of a
    user declaration)
  ! jnc_ct: critical fix: incorrect this-arg-offset in case of multi-level
    multiple-inheritance
  ! jnc_ct: critical fix: ensure target type layout before checking POD vs
    non-POD in a data pointer cast
  * jnc_ct: replace AuxCompileFlag_SkipAccessChecks with a counter (to be able
    to handle nested disableAccessChecks/enableAccessChecks calls)
  + jnc_ext: add (optional) size limit for dynamic layouts, check for overflows
  * jnc_edit: handle completer palette separately (the Fusion QT style doesn't
    work well with transparent "invalid" highlitht text color)
  + jnc_io_usbmon: add io.detectUsbMon (maps to axl::io::detectUsbMon)
  + jnc_io_devmon: add io.detectDeviceMonitor (calling dm::Monitor::isLoaded)
  + jnc_std: add floating point conversion functions: atof, atod, strof, strtod
  * jnc_edit: update highlighting and current line on theme change
  * jnc_ct: special case: allow casting from a variant holding a jnc.Function*
    to a thin function pointer of exact function type
  + jnc_rtl: add jnc.ClassType.createObject (dynamic instantiation)
  * jnc_ct: typeof operator on classes should automatically require this class
    (unless the class is abstract or opaque-non-creatable)
  + jnc_ct: add the class ref cast operator (same as data ref cast: addr ->
    cast ptr -> indir)
  * jnc_ct: expose Value::m_item and set it for codegen-less values, too
  + jnc_std: add char classifier functions (isspace, isprint, ispunct, etc)
  * jnc_rtl: DynamicLayout::asyncScanTo shouldn't call prepareForWait for
    non-stream layouts (prepare promise only)
  * jnc_ct: force Alignment = 1 for dynamic layouts
  * jnc_ct: when overriding virtual functions, use the corresponding function
    src pos
  * jnc_ct: don't set LLVM value for virtual functions if no codegen
  * jnc_ct: resolve imports when getting basetypes
  * jnc_ct: set Const::m_module
  * jnc_std: std.Buffer.copy/append/insert should accept NULL as p (then it's a
    zero-memory)
  - jnc_io_pcap: fix: axl::io::Pcap::getLinkType actually returned DLT_xxx,
    not LINKTYPE_xxx
  * jnc_ct: process code assist for inline definitions of member reactors
  * jnc_ct: don't automatically set scope in NamespaceMgr::openNamespace
  - jnc_ct: fix: member reactor reaction declaration was wrong all this time
    (there should be no 2nd pointer argument)
  * jnc_ct: inline trivial Value methods
  - jnc_edit: don't show internal items (!-prefixed) in auto-completion lists
  * stdlib: update source lists (add rtl dynamic layout & io extensions)
  * jnc_ct: replace special chars (" ' < >) with XML entities when generating
    XML documentation
  * jnc_ct: clear memberXml before generation (some implementations of
    generateDocumentation assume it's empty)
  - jnc_ct: fix: reactor onevent statement had no access to event parameters
  * llk: use `return err::fail()` instead of `err::setError(...); return false`
  * llk: after failing a user action, advance to next token to avoid potential
    loop

  AXL changelog:

  + axl_io_usbmon: add io::detectUsbMon()
  + axl_io: add implementation of io::isSymbolicLink on Windows
  + axl_io: add wchar_t-overloads for io::isSymbolicLink/getSymbolicLinkTarget
    and move the core of implementation there
  + axl_sys: add linux kernel module enumerator (useful for detecting the
    presence of modules)
  * axl_io, axl_core: build basic file IO and mappings in axl_core (circular
    dependencies on GCC otherwise)
  + cmake: support Qt5DBus
  - axl_sl: typo fix: geLoBit8 -> getLoBit8
  - axl_sl: remove redundant sl::String::replace overload
  - axl_sl: fix: swapByteOrder worked incorrectly for size = 1
  + cmake: add support for the MSVC address sanitizer
  - axl_io_pcap: fix: pcap_datalink returns DLT_xxx, not LINKTYPE_xxx
  * axl_sys: getProcessImageName: specifically handle special PIDs on Windows
    (namely, System & System Idle Process)

................................................................................

version 5.6.0 (2024-05-30)

  Major update. Introduces the new dynamic layout syntax in Jancy (`dylayout` &
  `dyfield`) for creating protocol analyzers & dynamic packet templates; packet
  byte-range hiliting and other major improvements in the packet template
  engine; packet templates for the TCP/IP stack; the new `pretransmit` IAS
  (in-app-scripting) entry point for the on-the-fly packet encoding; standalone
  logs can now create menus & toolbars; multiple critical fixes across various
  modules.

  Main application changelog:

  ! nj_app, nj_ias: dynamic layouts in the property template pane
  ! nj_app, nj_ias: plugins can export packet templates of their own
  ! nj_ias, nj_app: packet templates support bitflag enums now (unroll enums
    into a series of bool properties)
  ! nj_app, nj_ias: major update: dynamic string fields (toString/fromString)
  ! nj_app, nj_ias: packet template-driven range hiliting
  ! nj_app: allow menus & toolbars for standalone logs
  ! nj_ias, nj_srv: major update: transmit() is synchronous again
  ! nj_ias: new entry point: pretransmit() for dynamic packet encoding
  ! nj_doc: critical fix: add form objects as GC roots
  ! nj_ui: critical fix: remove UI objects from the object map on destruction
    (could cause crashes)
  ! nj_log: onLogRecord() runs in a separate thread now
  * nj_app, nj_ias: improved field <-> hex-edit synchronization
  * nj_ias: respect the `formatSpec`, `ungroup`, `displayTypes` attributes of
    packet template fields
  * nj_app: don't add empty aggregates to the packet template widget
  * nj_app: remove editor for "binary" packet template fields
  * nj_app: set-log-base-time-as-line should be available for standalone logs
  * nj_app: derive LoginDlg & ProgressDlg from CenteredDlg (use common style)
  * nj_ui: add InsertActionPos -- allow inserting menu & toolbar items to the
    tail or head -- crucial for log filters with UI
  * nj_log: on log representer exception, add exception information to the log
    directly
  * nj_srv: propagate error in syncTransmit()
  * conf: add the Modbus-ASCII pretransmit encoder
  * nj_ias: reduce receive loop delay to 100ms
  * nj_ui: new class: ui.ColorRangeTree (based on axl::sl::RangeTree)
  * nj_app: don't add the root item to the packet template widget
  * nj_ui_srv, nj_app: allow setting -1 to enum properties (aka, no selection)
  * conf: diverge modbus (legacy-vs-dylayout)

  Scripts changelog:

  ! wizards: the proto-analyzer wizard is using dynamic layouts now
  ! ssh-*: major update: use the common ssh code in iox.SshChannel
  ! pcap: ethernet packet templates (based on dynamic layouts)
  ! pcap, ethernet-tap: major update: allow filtering & exporting to pcap for
    standalone logs
  ! ias: transmit() is sync again
  ! ias: onLogRecord() runs in a separate thread
  ! ias: new entry point: pretransmit()
  ! modbus: a new Modbus analyzer based on dynamic layouts (the original plugin
    is available as Modbus legacy)
  ! common: major feature: new method for representing packets:
    log.representDynamicLayout()
  ! ias: fix: receiveAll() incorrectly calculated the remaining timeout
  + all: add io.EthernetAddress.toString/fromString
  * all: make use of the new 'stringify' attribute
  * packets: add "packetTemplate" attr to all legacy packet templates
  * ssh-*: refactor SSH connect params initialization
  * common: remove PropertyId.PrivateKeyFile (combine with
    PropertyId.AuthenticationMethod)
  * net-sniffer-log, ethernet-tap-log: make log-to-pcap virtual (so that we can
    override for particular log records)
  * ethernet-tap: remove export-pcap (should be handled by the log plugin)
  * net-sniffer-log, pcap: use the newly added ui.ToolBar & ui.Menu prop
    m_insertActionPos
  + ias: add modbus-ascii script (re-encodes Modbus RTU -> ASCII on-the-fly)
  * ias: update http-server script (now onLogRecord runs in a dedicated event
    thread, so it's ok to call stuff)
  + add pretransmit() to the default script
  + api: add destructors to UI classes (make sure we remove the object from the
    ObjectMap on destuction)
  * common: array digests, respect the bigendian flag for arrays,
    show base type fields
  - common: typo fix: RpdVersion.m_hardwareVersion -> m_hardwareType
  + api: add ui.ColorRangeTree
  - api: fix: ui.FontFlags should map directly to njs::FontFlag_xxx
  * all: use the simplified const property syntax where possible
  * all: fixes re latest jancy changes (dylib/dyfield/bignendian)

  Ninja Scroll changelog:

  ! njs_hexedit: add static range hilites (use the newly added AXL class
    axl::sl::RangeTree)
  ! pch: critical fix: TRACE was not a noop in release
  ! njs_hexedit, njs_log: for hex-ascii, use a cursor rect instead of hilites
    (hilites dont work well with range hilites)
  - njs_log: fix: markupLastBinZoneLine should markup last lines in foldable
    records
  - njs_log: fix: finalize record should markup EOF in foldable records
  - njs_log: fix: sanity check in canMarkupDynamicEof() (folding can nullify
    m_currentLine)
  - njs_log: fix: markup bin zones in foldable records
  - njs_log: fix: reset regex state before marking each of the bin zones during
    an invalidate
  - njs_log: fix: delete binzones of foldable records on recrod folds
  * njs_hexedit:  for range highlights
  * njs_wdg, njs_hexedit, njs_log: round half-char width (must be an integer,
    otherwise drawRect might not be pixel-aligned)
  * njs_wdg, njs_hexedit, njs_log: use different colors for inactive selection
    (when the widget is not focused); redraw selection on focus change
  * njs_hexedit: fade hilite regions independently
  + njs_hexedit: allow setData beyond EOF

  QT Property Browser changelog:

  + api: add methods: QtTreePropertyBrowser::editedItem(), closeEditor() and
    overridable editorDestroyed()
  * qtpb: allow setting -1 to enum properties (aka, no selection)
  + qtpb: add property: QtProperty::extraIndent
  * qtpb: refactor & opt of item -> prop mapping (reduce map lookups)

  Jancy changelog:

  ! jnc_ct, jnc_rtl: critical update: refactor & fix struct field alignment
  ! jnc_ct, jnc_rt: critical fix: TRACE was not a noop in release
  ! jnc_ct: critical fix: close dynamic lib zip readers after the compile stage,
    not parse stage
  ! jnc_ct: critical fix: toString should be a cross-family cast
  ! jnc_ct: critical fix: ClassType should call ensureCreatable on all class
    fields in base classes
  ! jnc_std: critical fix: invalid C++ signature for std.setError(string_t)
  ! jnc_ct: major update: loosen function pointer casting rules; allow casting
    to a function pointer type with more arguments (ignoring extras)
  ! jnc_ct: new: named attribute blocks and attribute sharing
  ! jnc_ct: redesign codeassist fallbacks (also parse expression_pass1)
  ! jnc_ct, jnc_rtl: major redesign: dynamic structs are now replaced by
    dynamic layouts (created `dylayout` & `dyfield` keywords)
  ! jnc_ct: majore update: redesign bitfields & bigendians -- no more dedicated
    types; bitfields and bigendians are now properties of the data pointer
  + llk: add getter Parser::getTokenPool()
  * jnc_rtl: assert no tail padding in base types in rtl
  - jnc_rt: fix: with address sanitizer, we can't assume stack to grow up, so
    adjust ASSERTs accordingly
  * jnc_io_usb: force-map io.UsbDevice (enumerateUsbDevices implicitly allocates
    those)
  - jnc_ct: fix: await should be an unary operator (precedence issues otherwise)
  - jnc_ct: fix: add import fixup for m_asyncReturnType
  - jnc_ct: fix: calc layouts of async return types
  - jnc_ct: fix: when looking for virtual origin class, check the class itself
    first
  - jnc_ct: fix: when overriding virtual function, we must use the virtual
    origin class for vtable base idx (not the class where we found the function
    name during findDirectChildItemTraverse)
  - jnc_io_ssh: fix: remove the misplaced JNC_CDECL modifier in
    SshChannel::authenticateImpl
  - jnc_ct: opt fix: function_suffix_rslv should use qualified_type_name_rslv
    instead of  type_specifier
  - jnc_ct: opt fix: getConditionalOperatorResultType should use
    getCastKind(), not checkCastKind()
  * jnc_rtl: jnc.Type.getValueString() should use toString() when possible
  + jnc_io: add aliases for `fromString`
  * jnc_api:
  + jnc_api: add ModuleRequireFlag_Traverse (to require imports) and replace
    bool isEssential with this ModuleRequireFlag
  - jnc_api: remove ModuleItem::require()
  * jnc_ct: check required external functions
  * jnc_ct: toString should ask for OpFlag_KeepDerivableRef
  + jnc_ct: add the not-match operator (!~)
  + jnc_ct: add m_parentUnit to std func arguments with default values
  * jnc_ct: set m_parentUnit for type variables
  + jnc_ct: add Module::ensureJitCreated and call it from
    Variable::prepareStaticData()
  * jnc_ct: save & restore parse context (unit + namespace) uniformly
  - jnc_ct: remove the never used Parser::initializeReaction/finalizeReaction
  * jnc_io_ssh:  during the authentication loop, always report errors via
    SshEvent_SshAuthenticateError (to give a chance to re-authenticate)
  + jnc_io_ssh: support authentication with private-key-file-name (instead of
    a memory blob)
  - jnc_ct: fix: missing function thin ptr cast in Cast_FunctionPtr_FromFat
  + jnc_rt: optionally (conditional compilation) track foreign data boxes --
    this way, foreign buffers can hold GC roots
  * jnc_rt: always weak mark boxes (without prior checking)
  - jnc_ct: fix: use value intead of type in Closure::getArgTypeArray
  - jnc_ct: fix: getClosureAwareType() can return NULL -- check before deref
  * jnc_api, jnc_dll: move createDataPtrValidator, limitDataPtr,
    getDataPtrLeftRadius, getDataPtrRightRadius from RTL-core to common runtime
    (we might need some of those from C)
  + jnc_ct, jnc_rtl: add `dynamic offsetof` by analogy with `dynamic sizeof`
  * add jnc.getDataPtrLeftRadius(), jnc.getDataPtrRightRadius()
  - jnc_ct: fix: initialize alignment with 1, not 0 (problems
    with empty structs/unions otherwise)
  + jnc_api, jnc_dll, jnc_ct: add AttributeObserver (a quickfix for packet
    template-related function requirements)
  + jnc_api, jnc_dll: add api funcs: jnc::Unit::getFilePath/getFileName/getDir
  - jnc_io_websocket: fix: add missing includes (could have resulted in an
    incomplete destruction and leaks, depending on the cpp compiler)
  + jnc_rtl_intro: add property jnc.Type.m_typeKindFlags
  * all: remove unnecessary null-checks before `operator delete`
  - jnc_ct: fix: incorrect recursion error reports in import type (on repetitive
    resolve)
  * jnc_ct: make TryExpr and DynamicLayoutStmt persistent (scope structure can
    get broken, and we don't want dangling pointers in Scope)
  * jnc_ct: refactor pragma config handling (move current config from PragmaMgr
    to Parser); otherwise, undesired effects when switching between compilation
    units
  - jnc_ct: fix: tokens could be reused -- clear code assist flags before
    processing a token
  * jnc_ext: use the simplified property getter syntax where  possible
  + jnc_rtl: add jnc.limitDataPtr (reduce the allowed data pointer range)
  - jnc_api: fix: sanity check in jnc_Attribute_getValueVariant (prevent
    dereferencing types of null-variants)
  + jnc_ct: allow attributes inside non-compound branches (if/else/do/while/for)
  + jnc_api: expose jnc_ClassPtrType
  * jnc_ct, jnc_edit: rename keyword: `dynamiclib` -> `dylib` (similar to
    `dylayout` & `dyfield`)

  AXL changelog:

  ! axl_sl: critical fix: getLoBitmask/getHiBitmask could have caused UB with
    32/64-bit shifts
  ! axl_sl: critical fix: sl::BitMap was using incorrect number of pages and had
    an off-by-one overflow in the end
  ! axl_sl: major update: remove non-const index operators from sl::Array and
    sl::String (caused an implicit call to ensureExclusive() behind the scene)
  ! pch: critical fix: AXL_TRACE was not a no-op in Release builds
  ! axl_io_drw: critical fix: CFNumberGetValue used an incorrect type (resulting
    in stack corruption)
  - axl_sl: remove assert on swapByteOrder(size = 1)
  - axl_io: fix: handle empty & invalid IP4/IP6 strings
  + axl_sl: new class: RangeTree (for building correct & optimial Ninja Scroll
    colorization ranges)
  + axl_lex: add getter Lexer::getTokenPool()

................................................................................

version 5.5.1 (2024-02-29)

  Service release. Critical Jancy introspection regression fixes

  Scripts changelog:

  - wizards: fix: the protocol analyzer template shouldn't pass the code
    log.StdRecordCode.SessionStarted down to the parser

  Jancy changelog:

  ! jnc_rtl_intro: critical fix: jnc.TypeKind declaration missed TypeKind.String
    (hence, all subsequent type kind constants were wrong)
  ! jnc_rtl_intro: critical regression fix: for formatSpec, use StringRef::szn()
    instead of StringRef::sz() (we check formatSpec for NULL later)
  - jnc_ct: fix: for bigendian enums, swap byte order before looking up
    constants in EnumType::getValueString()

................................................................................

version 5.5.0 (2024-01-18)

  Major update. Introduces the new regex markup engine (based on the heavily
  modified Google RE2 library); the new built-in `string_t` type in
  Jancy (non-zero-terminated UTF-8 string slices) is now used for strings in all
  scripts; 100% correct display of UTF-8 multi-byte codepoints, continuation
  bytes, unprintable chars, and incomplete sequences (also across line and page
  boundaries in log and hex editor); a new implementation of bin-text in log
  without overhangs and with support for changing the CR/LF visibility; multiple
  critical bug fixes. Starting with this release, Windows XP is not supported
  anymore; UTF-16 and UTF-32 encodings were removed due to their limited
  usability in the log and terminal.

  Main application changelog:

  ! nj_app: new new regex engine and corresponding regex markup UI updates
  ! api: use `string_t` instead of `char const*` for strings
  ! ui: remove UTF-16 and UTF-32 encodings
  ! nj_app: new copy mode BinText (copy exactly as seen in the right pane of
    the hex view)
  ! nj_app: remove "show unprintable chars" settings for bin-text; now all
    unprintable characters are mapped and shown just like in hex-view
  ! nj_app: critical fix: pasting to the text transmit pane doubled all
    backslashes
  ! nj_app: critical fix: potential crash when dragging a packet from the packet
    library to the transmit pane
  ! nj_srv, nj_ias: critical fix: IAS `transmit` should return immediately
    without blocking (could have lead to deadlocks when used from `onLogRecord`)
  ! nj_app: new bin-text-related settings: bin-text-style, cr-lf-visible
  + nj_app: add shortcuts (Insert/Delete) for adding and removing items in the
    "Packet Library" and "Regex Markup" dialogs
  + nj_srv, nj_ias: add non-blocking IAS functions `initiateConnect` and
    `initiateDisconnect`
  - nj_app: fix: don't send terminal reports if a file transmit is in progress
    (caused skips in the transmitted bytes when terminal echo was on)
  * nj_app: make the file progress dlg rejectable (so it can be closed by ESC)
  - nj_app: fix flashing of the progress dialog after file transmit completes

  Scripts changelog:

  ! all: updates regarding the new Jancy regex syntax
  ! api: use `string_t` instead of `char const*` for strings everywhere
  - api: typo fix: log.LogWriter.write(recordCode, text) used timestamp instead
    of record code
  * api: make class ui.InformationValue opaque
  * modbus: add the [ fixedSize ] attr to ModbusTcpReadPacket

  Ninja Scroll changelog:

  ! njs_log: major update: port the markup engine to axl_re2 / re2s
  ! njs_log: major update: dynamic EOF markup
  ! njs_log: a major redesign of the bin-text implementation (remove overhangs
    caused by invalid UTF-8 sequences, add a new setting for CR/LF visibility,
    visualize tabs)
  ! njs_cmn, njs_log, njs_hexedit: use the decoder state for fully-correct
    calculation of continuation bytes at the line start and/or page borders
  ! njs_cmn, njs_hexedit, njs_log: add a new binary data copy mode (copy text
    exactly as seen in the hex-view right pane)
  ! njs_cmn: add special char mappings (middle-dot (U+00b7) for null-bytes,
    left-single-quote (U+2039) for continuation bytes, white-square (U+25a1) for
    unprintable char replacements, etc.)
  ! njs_log: combine same-zone binary data into continuous blocks (both for
    optimization and code simplification)
  ! njs_cmn: critical fix: when emitting code units, we also need to check for
    printable-non-mark (could produce visual glitches depending on font)
  ! njs_hexedit: critical fix: encoding input characters used a
    non-null-terminated string (and thus produced undefined results)
  ! njs_log: major update: redesign checker pattern calculation
  ! nj_term:: critical fix: xterm_BS should take not allow moving to history
    lines
  - njs_log: fix: for reverse range processors, don't process new zone
    immediately (postpone that until processReversePartList()
  - njs_log: fix: zoneOffset of the prev-page-merge-line should be the same as
    merge-offset (use it for col-calculation)
  - njs_hexedit: fix: adding/removing lines should invalidate the widget all the
    way to the bottom
  * njs_cmn: change copy-as-c-array whitespace style to K&R
  - njs_term: fix: prevent reentrant writes (replies to report requests when
    local-echo on)
  * njs_term: draw cursor at m_colCount normally
  * njs_log: when generating codepoint tooltips for bin-text lines, use the
    whole available buffer (not just BinTextLine::m_binSize)
  * njs_log_wdg, njs_hexedit: when copying hex view/bin text, respect decoder
    state at specific offsets
  * njs_hexedit: if data change is close to an inter-line border, redraw the
    possibly affected lines, as well
  * njs_log: maintain inter-leaf char decoder states for bin-hex & dual-bin-hex
  * njs_cmn: pad with incomplete-chars, not continuation-byte-chars
  - njs_cmn_wdg: fix: on selection change, handle the case of empty
    selection (don't redraw from the very top)
  * njs_cmn_wdg: opt: add WA_StaticContents & WA_OpaquePaintEvent to all widgets
  - njs_log_wdg: minor fix: one unnecessary extra line was redrawn in
    onRepresentPageCompleted
  * njs_cmn, njs_srv: trivial: IndexFile::addLeaf() should return `IndexLeaf*`,
    not `const IndexLead*`
  * njs_cmn_wdg: set default hex-ascii gap to 1 (otherwise, it looks different
    from the offset gap)

  Device Monitor changelog:

  ! tdevmon: release tdevmon-3.3.13 (linux-only)
  - dm_lnx_lkm: compat fix: in linux-6.5, they killed ITER_PIPE; adjust
    iov_iter_is_pipe accordingly
  - dm_lnx_lkm: compat fix: in linux-6.4, they changed class_create to accept
    only one param (const char* name)

  Jancy changelog:

  ! all: major update: new type `string_t` (non-zero-terminated UTF-8 string
    gslice) and major string handling optimization
  ! jnc_ct, jnc_rtl: major update: port the regex engine to axl_re2 / re2s
  ! jnc_rtl: critical fix: appendFmtLiteralStringImpl should not go beyond the
    end-of-range when checking for null-termination
  ! jnc_edit: call unloadDynamicLibs from the code-assist thread (so that
    dynamic lib uninitializers are called from the same thread)
  ! jnc_ct: major update: support llvm-17 (so now it's llvm-3.4.2 -- llvm-17)
  ! jnc_ct: critical typo fix: arm32/arm64 "cdecl" callconv-s were incorrectly
    mapped to gcc32/gcc64
  ! jnc_ct: critical fix: amd64 system-V ABI off-by-one miscalculation at
    callsites (the sret arg was incorrectly counted)
  ! jnc_ct: critical fix: only propagate releavant type flags (make sure we
    don't accidentally propagate layout & signature status flags from one type
    to another)
  + jnc_api, jnc_dll: add jnc_Module_unloadDynamicLibs()
  - jnc_ct: fix: set type for pass-on-stack args
  * readme: update the latest supported version of llvm (llvm-17)
  * jnc_ct: assert function type match in LlvmIrBuilder::createCall
  - jnc_ct: fix: jnc::ct::Function declarations of llvm.memset/llvm.memcpy/
    llvm.memmove were incorrect (the align parameter was removed in llvm-7)
  - jnc_ct: fix: flush llvm::raw_string_ostream before accessing the target
    std::string
  + jnc_ct: map __chkstk on windows
  - jnc_ct, jnc_edit: remove `variant` keyword (not a keyword anymore); replace
    it with the `variant_t` typedef
  - jnc_ct: fix: LlvmIrBuilder::createSwitch (intptr_t -> int64_t)
  * jnc_std: update re latest axl rename (ascii -> latin1)
  * jnc_ct: clone the alias initializer token list before resolving (otherwise,
    code assist for alises is empty)
  * jnc_edit: delay startup of the code assist thread when triggered by
    keypresses in the editor
  * jnc_ct, jnc_edit: support code-assist thread cancellation
  - jnc_edit: leak fix: Model for auto-complete could be orphaned -- create a
    completer before the model
  - jnc_ct: fix: a single token leak in code assist loop
  * jnc_ct: don't convert to closure-aware-type in prepareOperandType() -- this
    loses default args
  - jnc_ct: fix: maintain scope structure after failed parse of a default arg
  - jnc_ct: fix: skipped args with default values should yield "identity"
  - jnc_ct: typo fix: CastKind_Identitiy -> CastKind_Identity
  - jnc_ct: fix: integer constant extensions and byte swaps should yield
    "identity" cast kind (not "implicit")
  - jnc_ct: fix: `null` values should yield "identity" cast kind, not "implicit"
  - jnc_ct: fix: ensure layout before checking if type is stringable or
    disposable
  + jnc_std, jnc_io: make socket addresses stringable by adding toString()
  * jnc_ct: refactor attribute processing & unused state detection (undefined ->
    created -> staged)
  - jnc_ct: fix: handle no-code-gen in OperatorMgr::getStructField for
    non-ptr-values
  * jnc_ct: move pragma handling to PragmaMgr
  * jnc_ct: for simple const properties, use body for the getter
  * for simple read-write properties, disallow bodies
  - jnc_api: fix: variantRelationalOperator didn't handle NULL-type in variant
    properly
  * jnc_rtl_intro: add `const` modifiers to introspection class methods
  * jnc_ct: default processing for logical ! operator (cast to bool, compare to
    zero)
  * jnc_ct: simplify OperatorMgr::getConditionalOperatorResultType (prefer
    `true-type` unless can't cast)
  + jnc_api: add GcHeap::markVariant
  * jnc_api: opt: format variants using function tables rather than switch
  * jnc_ct: opt: select arithmetic result type using tablesrather than switch
  * jnc_ct: opt: prepare operands using functions tables rather than branches
  * jnc_io_hid: force-import io_HidDb.jnc (otherwise, the required
    io.HidUsagePage could be missing)
  + jnc_ct: add jnc::OverloadableFunction::ensureLayout (and use it from
    Orphan::adoptOrphanFunction)
  * jnc_ct: allow recalculations of signatures (due to imports)
  * jnc_ct: minor refactor in Orphan::adoptOrphanFunction
  * jnc_ct: normalize type signatures
  * jnc_ct: ensure indexer property getter layout before choosing the best one
  - jnc_ct: fix: use Token::Pos instead of lex::LineCol
  - llk: fix: ensure no tail padding in llk::SymbolNode
  - llk: fix: (unlikely) leak of an invalid char token

  AXL changelog:

  ! axl_re2: new axl_re2 library (wrappers for re2s, a heavily modified fork of
    Google RE2)
  ! axl_sl: critical fixes in the implementation of the incremental reverse
    boyer-moore find (could have lead to missing matches and even crashes)
  ! axl_enc: major update: a redesign of the UTF-8 reverse decoder DFA (now it
    yields a sequence of CPs strictly isomorphic to that of the forward UTF-8
    decider)
  ! axl_enc: major: redesign for the enc::Locate implementation (a simple
    overshoot compensation won't work for the reverse UTF-8 decoder)
  + axl_enc: add enc::CharCodec::getPendingLength(enc::DecoderState)
  + axl_enc: add enc::Advance and enc::CharCodec::advanceDecoderState
  + axl_sl: add CircularBuffer::peek()
  + axl_enc: opt: emission of pending CUs in forward UTF-8 DFA does not need to
    bitwise-and 0x3f for the header byte
  - axl_enc: fix: utf-8 should use unsigned comparisons for encoding
  * axl_test_qt: bench codecs
  * axl_enc: opt: UTF DFAs must first check for State_Ready (i.e., w/o errors)
  + axl_enc: enc::CharCodec::calcRequiredBufferLengthToDecode_xxx now accept
    enc::DecoderState (also add simple inline wrappers without it)
  + axl_g_pch: add AXL_HAS_TAIL_PADDING/AXL_ASSERT_NO_TAIL_PADDING macros for
    tail-padding checks
  * all: remove axl mem tracker (use crt debug facilities on msvc and the leak
    sanitizer on gcc/clang)
  * axl_enc, axl_sl, axl_re: rename codec: Ascii -> Latin1
  - axl_lex: fix: ensureSrcPosError should NOT push SrcPosError over NoError
  * axl_sl: BitMapN should use unsafe (and faster) bit manipulation functions
  * axl_sl: opt: sl::StringRef::ensureNullTerminated: avoid unnecessary
    incref/decref when transferring ownership
  * axl_sl: opt: StringRef::isEqual should use memcmp rather than
    StringDetails::cmp

................................................................................

version 5.4.2 (2023-11-09)

  Service release. Introduces the new HID Monitor plugin.

  Main application changelog:

  * nj_app: resize dockable widgets according to their size hints
  + package/win: install msvcrt10 with new windows (msvc15) packages, too
    (libusb-1.0.dll depends on msvc10)
  + conf, package/msi: add the hidmon plugin on windows and linux

  Scripts changelog:

  ! new hidmon (HID Monitor) plugin
  + hid: count TX & RX stats
  * usb, usbmon, hid: when showing device info, prefer descriptor strings to DB
    strings
  - samples: fix: DeviceParams -> UsbDeviceParams (recent changes in UsbLog)
  * hid, usb: add Hid/Usb prefixes to log record structs, cleanup formatting of
    VIDs/PIDs
  * hidlog: prefer usages specified later; show subcollections before fields

  Ninja Scroll changelog:

  ! njs_log_srv: process new zone BEFORE bumping the zone index (otherwise, the
    processing of EOF happens in the next zone, and this could yield wrong find
    results)

  Jancy changelog:

  ! jnc_ct: win: make filepath lowercase when building a set of parsed files
    otherwise, this could lead to some scripts being parsed multiple times
  ! jnc_io_hid: critical fix: m_collectionArray should grow using
    setCountZeroConstruct (m_rd->getCollection() can trigger GC)
  ! jnc_io_hid: new HIDMON enumerator
  - jnc_io_usb: fix: incorrect ASSERT() in UsbMon on windows (reopen after a
    failed attempt)
  - jnc_io_usb: fix: missing mapping of the io.openUsbDevice(vid, pid) overload
  - jnc_io_usb: fix: invalid order of fields in UsbInterfaceDescriptor

  AXL changelog:

  ! axl_io_hid: new HIDMON enumerator on Windows & Linux
  ! axl_sl: critical typo fix: BoyerMooreFindBase had hardcoded type uchar_t
    for comparison (must be templated typename C). Caused incorrect results
    when finding character codes >= 0x80
  * axl_io_hid: api change: prefer latest usages when decoding
  * axl_core: allow setting axl_g_traceFile to NULL
  * axl_io_hid: rename HidReportKind -> HidReportType and adjust values to
    match the HID specification (1 = Input, 2 = Output, 3 = Feature)
  * axl_io_hid: io::HidStandaloneReport now serializes LogicalMinimum,
    LogicalMinimum, UnitExponent, Unit)
  * axl_io_usbmon: use LIBUSB_CLASS_HUB instead of 0x09
  - axl_io_hid: remove USB_CONFIGURATION_DESCRIPTOR* m_configDesc (unused)
  * axl_io_hid: refactor HidRdParser
  * axl_sys_lnx: add `const` modifier to UdevDevice::getSysNum
  - axl_sys_lnx: fix: allow passing NULL for empty strings in
    UdevDevice::getParentWithSubsystemDevType (NULL is treated differentrly from
    an empty string)

................................................................................

version 5.4.1 (2023-10-05)

  Service release.

  Main application changelog:

  ! pacakge/msi: fix: add missing io_hid.jncx
  * conf: move HidLog.njplg to its own directory

  Hardware client changelog:

  ! ionina-hwc: fix: remove notification printfs for BROKEN frames (makes it
    impossible to pipe the output of ioninja-hwc directly to Wireshark)
  ! nj_hwc: immediately start FPGA upload on --firmware without a TCP or pipe
    server

  Scripts changelog:

  * hidlog: extract the HID log plugin to a dedicated dir
  * hid: take LogicalMinimum into account when choosing the output format for
    values (signed-vs-unsigned)

  Jancy changelog:

  + jnc_io_hid: add HID mon device enumerator (for usbmon-based HID monitoring)
  * jnc_io_hid: move m_releaseNumber next to m_usagePage/m_usage (so that HID
    fields are together)
  - jnc_io_usbmon: remove fields: m_manufacturerDescriptorId,
    m_productDescriptorId, m_serialNumberDescriptorId (pretty much useless)
  + jnc_io_hid: add bool const property io.HidReportField.m_isUnsigned

  AXL changelog:

  ! axl_io_hid: add enumeration of sniffable HID devices (windows only for now)
  ! cmake: prefer llvm-config to get a list of LLVM libraries to link (but fall
    back to llvm_map_components_to_libnames/llvm_map_components_to_libraries)
  + cmake: add recent c/c++ standards to the list of possible options for -std
  - cmake: fix: first check and include axl_io_usbmon, then axl_io_hid (hidmon
    depends on usbmon)
  + axl_io_usb, axl_io_usbmon: add fields: hubInterfacePath in UsbDeviceStrings,
    devInst in UsbDeviceEntry
  * axl_io_usb: refactor UsbDeviceStrings::queryStrings() to allow passing the
    USB hub device file directly
  * axl_sys_win: add `const` modifiers to all DeviceInfo getters
  + axl_io_hid: add bool HidReportField::isUnsigned()

................................................................................

version 5.4.0 (2023-09-28)

  Major release. Introduces the new HID plugin, improved high-DPI support on
  Windows, two sets of packages on Windows 10 (modern) vs Windows XP (legacy),
  a critical fix of IO code in the hardware client that causes packet loss in
  Ethernet Tap during high-load, major redesign & optimization of the Jancy
  tokenizer & LL(k) parser implementation, a critical fix in the log text search
  engine, fixes for many other potential crash conditions.

  Main application changelog:

  ! conf, test, package: install new HID plugin & libraries
  ! package: have two separate sets of packages on windows: modern CRT & QT for
    Windows 10 and leagacy MSVC10 CRT & QT 5.6.3 for Windows XP
  ! package: improved compatibility on Linux; runs on glibc-2.8 (2008) and up
  ! nj_app, nj_ui_app, nj_ui_srv: add support for removeObject
  ! nj_app: critical fix: update packet template pane when the server process
    terminates (e.g., due to a crash); otherwise, leads to dangling pointers and
    a crash of the main app
  ! nj_ias, nj_app: new 'hidden' and 'collapsed' attributes in packet templates;
    optimize and improve property grid update on hex editor changes
  * nj_app: prevent unintentional auto-shortcuts in document titles
  + add method Layout.clear() so it's possible to remove forms
  + nj_app: add version info on qt, llvm, openssl
  * nj_app: replace the DigiCert Root CA certificate with the one from Let's
    Encrypt (ioninja.com is using Let's Encrypt now)
  * nj_app: process DPI changes (e.g., when the user drags an app to a screen
    with a different DPI)
  * nj_app: activate centered-dialogs on show (weird focus behavior on older
    QTs on Linux otherwise)
  * nj_app: paint base background for the tabs in the find dlg
  - nj_app: fix: FindDlg::showEvent didn't call to the base class (which should
    center-align it)
  - nj_app: fix: memory leaks caused by PluginMgr::populatePluginMenu(),
    QtPropertyEditorFactory table & jnc::Edit theme

  Hardware client changelog:

  ! nj_hwc: critical fix: enforce proper order of usb transfers (libusb
    completions could be delivered out-of-order!)
  * nj_hwc: filter out zero-sized frames (wireshark doesn't know how to handle
    zero-sized frames and simply terminates)
  * nj_hwc: separate USB IO & transport threads to increase USB throughput
  + nj_hwc: add settings for read parallelism and buffer size

  Scripts changelog:

  ! hid: new HID terminal plugin
  ! ethernet-tap: critical fixes in the FPGA firmware file
  - usb: fix: keep the previous selection on device list refresh
  + samples: add packet templates for ErgoDox HID control
  * ssh-serialmon: only add --ioctl for Linux hosts (when portName looks like
    a Unix device name); otherwise, doesn't work with remote windows hosts

  Ninja Scroll changelog:

  ! all: use qreal for all on-screen coordinates
  ! all: improved high-DPI support
  ! njs_log: add support for overlapping after a wrap (otherwise, we miss
    a single pattern if the cursor is in the middle of it)
  ! njs_log: force re-sync during on-index-progress 0 (otherwise, we could
    potentially miss end-of-rebuild)
  - njs_log: fix: cleanup line gap calculation and usage (delimiters were not
    always properly drawn)
  * njs_log: process wraps during find (important for whole-word search)
  - njs_cmn: don't replace code units with dots in bin-ascii & bin-text
  * njs_log: rename range processors (now that there's no cache-proc vs
    range-proc duality)
  - njs_log: remove find & save cache processors (not used anymore)

  QT Property Browser changelog:

  + qtpb: add proxy style to force SH_ItemView_ShowDecorationSelected;
    otherwise, alternating colors do not include branches

  Jancy changelog:

  ! jnc_io_hid: new extension library for working with HIDAPI
  ! jnc_ct: add support for LLVM ORC JIT
  ! graco, llk, frame: major redesign and optimization of the main token loop
  ! jnc_ct: on arm, add signext/zeroext attributes to call sites (possible ABI
    incompatibility on ARM64 otherwise)
  ! jnc_ct: fix: check for presence of current function in
    ControlFlowMgr::lockEmission/unlockEmission (a possible crash otherwise)
  ! jnc_ct: fix: crash after error recovery due to lack of code-gen in
    OperatorMgr::getPropertyBinder, OperatorMgr::getPropertyGetter
  ! jnc_ct: support closure function/property ptr/refs as operands of the
    conditional operator
  ! jnc_ct, jnc_ext: critical update: never parse while mapping
  ! jnc_ct: remove LLVM IR instruction names
  ! jnc_ct: fix: disallow auto-size arrays as arguments
  ! jnc_ct: critical fix: regex for floating point tokens
  ! jnc_ct: updates & fixes for latest llvms (up to llvm-16)
  ! jnc_io_usbmon: apply device address filter on linux
  + add asserts for empty resolver stack in recover() -> synchronize()
  * llk, frame: free locators back to the node pool
  - graco: open target file first, then call getFullFilePath
    (realpath returns NULL for non-existing files; the out-buffer is undefined)
  * jnc_dll: bump SONAME
  - jnc_ct: fix: handle situation when the imported target type of a data
    pointer type is already resolved
  - jnc_ct: fix: clear PtrTypeFlag_DualTarget when folding dual data ptr type
  + jnc_ct: add a slot for cmut to data-ptr & class-ptr
  * jnc_ct: opt: TypeModifier_Const, TypeModifier_ReadOnly, TypeModifier_CMut
    are mutually exclusive -- remove redundant ifs
  * jnc_ct: make Type::getTypeStringTuple inline
  + jnc_api: add jnc_Module_getExtensionLibFilePath to find the path to .jncx
  - jnc_ct: fix: don't finalize invalid/incomplete properties
  - jnc_ct: fix: restore namespace stack on property decl errors
  - jnc_ct: fix: keep enum type for index operator operands
  - jnc_io_ssl: remove unused file io_SslSocketEvents.jnc
  - jnc_ct: fix: restore namespace stack on errors in DerivableType::parseBody
  + jnc_api: add jnc_strDup_w for wchar_t*
  - jnc_rtl: fix: regex match offsets are 64-bit now; make necessary adjustments
  * jnc_app: rename --disable-code-gen to --no-codegen, --compile-only to
    --compile, --jit disables --run, --no-codegen implies --compile, --debug
    same as --debug-info
  - jnc_ct: fix: only generate debug-locs for user functions
  - samples: fix: jnc_Module_initialize takes jnc_ModuleConfig* as the last
    parameter
  - jnc_ct: fix: missing declaration of disableLlvmGlobalMerge on arm
  + jnc_app: add compilation stage profiling; --time-report to show compilation
    stage times
  * jnc_io_websocket: require io.SslState
  * jnc_ct: set EnableFastISel = true when jitOptLevel == 0
  + jnc_api, jnc_ct: introduce the generated jnc_Config.h
  * jnc_api: check for null when mapping variables
  + jnc_ct, jnc_app, jnc_api: add module configuration (jit-kind, jit-opt-level,
    compile flags)
  * jnc_app: don't optimize on -O0
  * jnc_ct: reorder pass managers initialization (like in clang)
  * jnc_api: schedule llvm_shutdown() from jnc_initialize(); use atexit instead
    of axl module finalizers
  * jnc_mini_ide: center cursor on double-click in the module pane
  - jnc_ct: fix: assign declarator attributes to special-void-methods (e.g.,
    constructors, destructors, etc.)

  AXL changelog:

  ! axl_io_hid: new wrapper library for HIDAPI
  ! axl_lex, axl_dox, axl_st, axl_re, axl_ini: major redesign & optimization of
    the lexer API & implementation
  ! axl_sl: major optimization of the circular buffer implementation
  ! axl_sl: new boyer-moore API and implementation
  ! axl_sl: redesign API for uleb128/sleb128; add uleb128 encoder
  ! axl_mem: new memory allocation / memory tracker API
  ! axl_re: all offsets are 64-bit now
  * axl_zip: refactor: add `const` method modifiers where appropriate
  * axl_sl: opt: remove run-time empty-checks on List::removeHead/removeTail/
    eraseHead/eraseTail
  * axl_sys: optimize the TLS API to reduce ref-counting (mostly, we want
    pointers only)
  * axl_io: opt: no need to zero buffer prior to realpath()
  - axl_io: fix: add specialization to err::complete
  - axl_io: fix: on posix, check result of ::realpath
  - axl_sys_ca: fix: only use OPENSSL_INC_DIR on linux (could be NOTFOUND and
    thus cause cmake errors)
  + inc: add missing include redirectors (axl_mem_TrackerBlock.h,
    axl_re_StateInit.h)

................................................................................

version 5.3.3 (2023-05-18)

  Service release.

  Main application changelog:

  ! nj_app: critical fix: QT rpath on mac-arm64

  Hardware client changelog:

  ! nj_hwc: critical fix: invalid epoch in pcap timestamps
  ! nj_hwc: critical fix: ignore empty frames and frames with broken CRC from
    Ethernet Taps (empty frames cause Wireshark to stop capturing)

  Device Monitor changelog:

  ! tdevmon: release tdevmon-3.3.12 (linux-only)
  ! dm_lnx_lkm: fix: in the read_iter hook, override iov_iter.data_source to
    WRITE to make copy_from_iter() happy (linux-6.2+)

................................................................................

version 5.3.2 (2023-04-25)

  Service release. Introduces support for ARM64 (a.k.a. Aarch64)

  Main application changelog:

  ! nj_app: critical fix: handle early paletteChanged() notifications (default
    themes could still be uninitialized, which caused crashes with qt5ct)
  * package: mac: include target CPU suffix (now, we have two: amd64 & arm64)
  + nj_cmn: add /etc/ioninja to conf files search path to allow for a more
    natural placement of configuration files on Linux

  Scripts changelog:

  ! modbus: precise synchronization of the raw data with decoded modbus frames
  * serial: rename: SerialDispatch.m_break -> m_breakCondition (to conform with
    io.Serial.m_breakCondition)
  + serial-tap: add dispatch
  * serial: cleanup dispatch code
  + common: support nested structs in log.representStruct()
  - modbus: fix: the ascii representer used an incorrect offset for bad LRC
  - modbus: fix: the ascii parser didn't reset state to idle after LF
  - modbus: regression fix: the new form ui didn't properly switch the
    ASCII/RTU mode

  Ninja Scroll changelog:

  * njs_log: add default flags = 0 to Representation::retroColorize()
  - njs_log_wdg: fix: don't clear top markup during invalidation
  - njs_hexedit: fix: incorrect overlay paint logic
  - njs_hexedit: fix: adjust x-pos of hex-pane background
  * njs_log: improve state consistency when re-colorizing the tops of pages

  Device Monitor changelog:

  ! tdevmon: release tdevmon-3.3.11 (linux-only)
  ! dm_lnx_lkm: write protection removal on aarch64
  ! dm_lnx_lkm: critical fix: incorrect handling of the original filp
    close (could have resulted in skipped notifications)
  ! dm_lnx_lkm: critical fix: dup_iter can return NULL (not an error)
  * dm_lnx_lkm: define iov_iter_is_pipe on older kernels
  * dm_lnx_lkm: check for ANY connections before doing more expensive stuff
  - dm_lnx: fix: type of the 1st parameter for device class:devnode
  * dm_lnx_lkm: use atomic_inc/atomic_dec instead of
    __sync_add_and_fetch/__sync_sub_and_fetch (can be missing from libgcc)

  Jancy changelog:

  ! jnc_ct: fix: aarch64 abi uses up to [ i64 x 2 ] for sret/arg type coercion
    plus other aarch64 abi fixes
  - jnc_ct: fix: ensure non-empty DI unit file name (to suppress LLVM assert on
    forced imports)
  - jnc_ct: arm: fix: check for presence of global-merge before disabling it
  + jnc_rt: arm64: save exception address

  AXL changelog:

  * cmake, axl_g: by default, silence AXL_TODO on GCC (way too verbose)
  * cmake: use qt imported targets instead of qt5_use_modules on newer QTs
  * axl_glibc: on aarch64, only wrap math functions
  + cmake: axl_set_pch for gcc: add includes of imported targets

................................................................................

version 5.3.1 (2023-03-02)

  Service release.

  Main application changelog:

  ! nj_app: critical fix: loading a previously saved session caused a crash
    (a regression introduced in v5.3.0)

  Scripts changelog:

  * wizards: redesign the protocol analyzer wizard (a made-up binary protocol)
  * tx-modifier: unconditionally make a copy of buffer for retransmissions &
    inter-char delays -- transmit() receives a volatile foreign buffer ptr
  * wizards: refactor AnsweringMachine for the new Jancy regex engine/API
  - wizards: remove SyntaxHighlighter & TX/RX test (broken & irrelevant)
  * wizards: update brace style in Filter, Transport, SendToolBar

  Ninja Scroll changelog:

  - njs_log: fix: saveLogAsText() didn't pass the icon map parameter properly;
    as a result, the resulting log text file had missing icon characters

................................................................................

version 5.3.0 (2023-02-23)

  Major update. Introduces: new form UI for plugins, regex-based log markup,
  new USB Monitor plugin, new USB Endpoint plugin with support for simulatenous
  operations on multiple endpoints, log filters plugins for standalone log
  files, a critical fix in tdevmon for Linux on ARM

  Main application changelog:

  ! nj_ui: a new library of widget classes for building form UI from scripts
  ! nj_app: the new log regex markup engine replaces log colorizer
  ! nj_cmn, nj_log, nj_srv: replace log record filters with scripted log filters
    applicatble to standalone logs
  ! nj_app, nj_srv, nj_ui_app, nj_ui_srv: move implementation of QTPB dictionary
    property to ioninja, add new dictionary widget & major refactoring of
    dictionary properties
  ! nj_app: macOS AppStore build: fix crashes during in-app purchases due to
    incomplete IAP product registration
  * nj_app: use back-alt color for read-only script editors
  * nj_ui_srv: remove `opaque` modifiers from classes that don't really need it
  * nj_ui: invoke `onchanged` for ui.Action.m_isChecked when set
    programmatically
  * package/msi: install USBPcap, io_usbmon.jncx
  * nj_app, nj_ui: in QFormLayout, use left align for labels grow all fields
    (important on macOS)
  * nj_app: eliminate layout "jumping" when switching between documents of the
    same kind
  * nj_app: don't silently ignore conflicting plugins loaded from different
    locations -- show a "conflict" error instead
  + nj_ias_srv: new function: `unreceive`
  + nj_srv, nj_app: add OOB (out-of-band) messages, add new `getTransmitData` to
    fetch contents of the transmit pane from the server
  + nj_app: new class: DockWidget to take care of proper tab navigation within
    a pane
  + nj_log: add log record size checks in StdRecordCode_RetroColorize and
    StdRecordCode_Error
  * nj_app, nj_ui: keep track of all icons & properties created by layers so
    that we can delete them on layer removal
  * nj_app: when saving log, show errors on insta-failures
  - nj_app: fix: check if the server process is created before sending a
    disconnect message
  * conf: rename: com.ioninja.log-colorizer -> com.ioninja.log-regex-markup

  Scripts changelog:

  ! api: new library of widget classes for building form UI
  ! all: new form UI for all relevant plugins
  ! usbmon: new plugin: USB monitor
  ! usb: new plugin: USB Endpoint (a combination of USB Data Endpoint +
    USB Control Endpoint w/ support for simultaneous IO on multiple endpoints)
  + all: suport connect()/disconnect() functionality in applicable plugins
  + api: new function: unreceive() to put data back in the receive buffer
  + api: new function: getTransmitData()
  + api: add methods: ui.EnumProperty.addOption(), ui.EnumProperty.clear(),
  * pipe-server: move filter to the log plugin
  * websocket: use new ui.StdEditToolBar
  + common: new helper class: ui.StdEditToolBar
  + api: add helper funcs: insertDictionaryHead/createDictionaryHashTable/
    findDictionaryEntry
  * api: rename: DictionaryProperty.m_keyLabel/m_valueLabel ->
    m_keyColumnName/m_valueColumnName
  * api: add m_placeholderText
  * websocket-client: change default address (ws://demos.kaazing.com/echo is
    dead now)
  * all: new plugin ServerSocketLogFilter
  * rename: ComboBox.m_onEnter -> m_onReturnPressed
  * serial: update plugins now that log filters are auto-loaded
  + common: new class: LogRecordCodeFilterUi (for building LogFilter-s)
  * all: rename: toolTipText -> toolTip
  * serial: extract serial log processing into a dedicated directory SerialLog
  * doc: extract base class: doc.PluginConfig
  * doc: move: doc_LogDocument.jnc to api/
  - serial: fix: SerialDispatch.m_statusLines is a read-only property
  - serial: typo fix: on serial error, one attempt of reopen happen regardless
    of the "Reopen on error" property

  Ninja Scroll changelog:

  ! njs_log: major redesign: regex colorizer -> regex markup (also support
    regex-driven delimiters)
  ! njs_log: critical fix: don't lose sticky-scroll on fast log growth
  - njs_log: regression fix: copy bin as hex-view wasn't re-implemented after
    the recent major redesign
  + njs_log: introduce LogWidgetFlag_StickToBottomShadow to restore the
    stick-to-bottom mode after a series of vertical scrolls
  - njs_log: fix: redraw and stick-to-bottom on fold-record
  - njs_log: fix: incorrect m_msgSize in ClientPeer::sendRangeProcessErrorMsg()
  - njs_log: fix: don't use -2 as the end-range-line in saveLogAsText(); use
    getLineCount() - 1 instead
  * nj_log: optimize redrawing of the prev line (only necessary when appending
    data to the log)
  * njs_cmn, njs_log: offset backgrounds for hex-view a half-char-width to the
    left

  Device Monitor changelog:

  ! tdevmon: release 3.3.10 (linux-only)
  ! lkm: critical fix: on ARM LPAE and linux-4.14.3, must clear PMD_SECT_AP2
  ! lkm: ifdef read_iter/write_iter (to support linux kernels prior to v3.16.0)
  * make: move -Wno-date-time from pragma to compiler options
  * app: link to dl (might be required with the new axl and older gcc-s)
  * cmake: a minor fix to allow building tdevmon.ko from a bundle-repo
  + lkm: add -Wno-parentheses (suppress a useless warning)

  Jancy changelog:

  ! jnc_io_usbmon: new extension library for USB monitoring
  ! jnc_io_usb: major update re the latest changes in axl USB enumerator
  ! jnc_ct: added support for +/- pointer operators for arrays
  ! jnc_ct: critical fix: check for errors in leave {} syntax rule handlers
  ! jnc_ct: critical fix: TypedefShadowType should fetch target type *after*
    calling ensureLayout() -- to properly handle import fixups
  ! jnc_io_cmn: blockingWait() now uses the newly added interruptible rt::Event
  ! jnc_io_usb: fix: mark opaque gc root UsbDevice::m_deviceDescriptorPtr
  * jnc_edit: add BaseBackDisabled to theme color sets use it for read-only
    background
  * jnc_edit: don't draw extra-selections (e.g., current-line) in read-only and
    disabled modes
  * jnc_rt, jnc_sys: refactor interruptible sys::Event::wait() -- move
    implementation to jnc_rt_Event.h (to make it reusable across extension libs)
  * jnc_edit: set RUNPATH to $ORIGIN/@loader_path
  + jnc_std: add non-const overloads for memchr, memmem, strchr,
    strrchr, strichr, strpbrk, strstr, stristr
  - jnc_ct: fix: EnumType::getValueString should use zero-extension (just like
    calcEnumConstValues and parseConstIntegerExpression)
  + jnc_api: new class StdBuffer (maps to std.Buffer)
  * jnc_io_usb: rename: UsbInterface.m_parentDevice -> m_device,
    UsbEndpoint.m_parentInterface -> m_interface
  + jnc_api: add jnc_strDup_utf16
  * jnc_io: rename: io.SerialPortDescMask -> io.SerialPortDescFlags
  - jnc_ct: fix: resolve import base types of enums before namespace traversing
  - jnc_ct: fix: cast array -> bool should yield true
  * jnc_io: non-critical: move leaveNoCollectRegion to a more logical location
  - jnc_rtl: fix: invalid format specifier for pointers in data-out-of-range
    error message
  * jnc_rt: adjust default for leaveNoCollectRegion(bool canCollectNow = false)
  - jnc_ct: fix: don't (prematurely) allocate variables and resolve orphans
    during the parse stage
  - jnc_ct: fix: when adding bodies to global namespaces, reset the state to
    NamespaceStatus_ParseRequired
  - jnc_ct:: fix: TypeMgr::requireExternalReturnTypes() &
    VariableMgr::initializeGlobalVariables() should fully process and clear
    arrays -- even on errors. VariableMgr::initializeGlobalVariables() should
    open the namespaces of corresponding global variables before parsing the
    initializer
  - jnc_ct: fix: processCompileError(ModuleCompileErrorKind_PostParse) didn't
    always close namespaces
  * style: unify indent style for JNC_BEGIN_CALL_SITE/JNC_END_CALL_SITE
  - jnc_ct: fix: ct::GlobalNamespace::clear should clear extra body list
  * jnc_io_base: doesn't depend on libudev anymore (axl links to
    libudev dynamically)
  - jnc_io_devmon: fix: invalid struct layout (m_activeEvents and m_unused were
    misaligned; luckily, those are never really used)
  + jnc_ct: add support for throw <error-expression> (set error, then throw)
  + jnc_ct: add `std` namespace to the list of standard namespaces (so that we
    can access it from the compiler)
  * jnc_io_base: refactor serial & network adapter enumeration code

  QT Property Browser changelog:

  + qtpb: add method: QtEnumPropertyManager::addEnumName (a single string)
  * qtpb: expose QtEditorFactoryPrivate (to make qtpb extensible) and remove
    dictionary property -- now it can be implemented as an external extension

  AXL changelog:

  ! axl_io_usbmon: new module axl_io_usbmon for capturing USB traffic; uses
    USBPcap on Windows and usbmon on Linux
  ! axl_sys: major update: full redesign of libudev wrappers (lazy dynamic
    binding, no dependency on libudev.h)
  ! axl_io, axl_io_shmt: move shared memory transport into a dedicated library
    called axl_io_shmt
  ! axl_io_usb: major update: sync libusb enumerator with Windows device tree
    or macOS IOKit registry to fetch extended information & descriptors
  - axl_sl: typo fix in AXL_SL_PROTO_SEND_FUNCTION_3 (T2 -> T3)
  * axl_io: rename: SerialPortDescMask -> SerialPortDescFlag
  + axl_cf: new methods: MutableDictionary::create(), Number::Number(
    CFNumberType, const void*)
  - axl_io_usb: fix: invalid wrapper around libusb_get_string_description_ascii
    (needs special handling)
  - axl_io_usb: remove libusb dependency for axl::io::UsbError (we can use axl
    libusb error provider without linking to libusb)
  * axl_io_usb: change return value from UsbDevice::getDescriptor(),
    getStringDescriptor(): bool -> size_t
  - axl_io_usb: typo fix: incorrect return on error in UsbDevice::getDescriptor
  - axl_io: remove unneeded accessors in SerialPortDesc and NetworkAdapterDesc
  * axl_io: rename: completeOverlappedRequest() -> completeOverlappedIo();
    add new method isOverlappedIoCompleted()
  * axl_io: update io::UsbDevice API (add const modifiers, fix libusb versioning
    about port path API)
  * axl_io: update linux serial port enumerator for the latest libudev wrappers
  - axl_sl: fix: sl::String::getBuffer should still set length when buffer is
    NULL
  * axl_io: rename: createNetworkAdapterDescList -> enumerateNetworkAdapters
    createSerialPortDescList -> enumerateSerialPorts
  - axl_io: remove the never-used axl_io_Transport.h and friends

................................................................................

version 5.2.1 (2022-10-28)

  Service release. Introduces: save log selection as .njlog or .txt, save
  terminal as .txt, sort serial port list in all serial-based plugins, major
  redesign of the sticky-scroll implementation in the log and terminal widgets,
  fixes of multiple long-time UI issues.

  Main application changelog:

  ! nj_app: new log menu items: "Save Log Selection As..." to save selected
    portions of log into .njlog or .txt files
  ! nj_app: new terminal context menu items: "Save As..." and
    "Save Selection As..."
  ! nj_app: fix: the "settings" corner button in log and terminal widgets
    disappeared on every parent scroll and essentially was inaccessible on
    heavy load
  - nj_app: fix: terminal was not restored from the minimized state on the
    "Show Terminal" toolbar button click
  - nj_app: fix: on hiding the packet template pane, remove the maximum data
    size limit in the hex editor
  - nj_app: don't show temp files location in the "New Session" dialog when
    running in the sandbox (AppStore review issue)
  * nj_app: ask the user whether to stop the script before closing the script
    pane
  * nj_app: terminal: convert LF -> CR-LF by default
  - nj_app: fix: log statistics were not properly updated in the information
    pane due to a typo
  * nj_app: in the terminal context menu, we must show alternative shortcuts for
    copy/paste (Ctrl+C, Ctrl+V have a different meaning in the terminal)
  * nj_app: redesign UI for save log selection/binary selection/as text
  - nj_app: fix: switching between sessions cleared the property template
    widget
  - nj_ui_app: fix: handle log palette colors in Jancy combo boxes
  - nj_ui_app: fix: handle transparent colors in the information pane
  + nj_app, nj_cmn: add new plugin property: null-packets to allow or disallow
    empty packet transmission (defaults to `false`)
  - nj_app: fix: handle null-packets when iterating through history
  - nj_app: fix: layout of the Save Session dialog (min-size was hardcoded)
  + nj_hwc: add EZ-USB config uploader

  Hardware Client changelog:

  ! nj_hwc: new command-line option: --index (for specifying zero-based tap
    index)

  Scripts changelog:

  * common: sort serial port lists in all serial-based plugins
  * all: set null-packets = true where it could be required
  * all: rename: ui.ColorFlags.Transparent -> Undefined

  Jancy changelog:

  ! jnc_ct: fix: don't try to delete LLVM unreachable blocks; leave that for
    the LLVM optimization pass (caused compilation failures with `return` in
    the middle of a basic block)
  - jnc_ct: fix: normalization of multi-line literals
  + jnc_std: new functions: std.sort(), std.Array.sort()
  - jnc_ct: fix: don't skip namespace finalization for documentation &
    code-assist scenarios
  - jnc_ct: fix: check public/protected access on items accessible through the
    `using` directive

  Ninja Scroll changelog:

  ! nj_log, nj_term: major update: redesign of the sticky-scroll implementation
    in the log and terminal widgets
  ! njs_log: critical update: remove lossless observers (the existing
    implementation leads to potential deadlocks under heavy load conditions)
  - all: fix: mouse cursor must be applied to QAbstactScrollArea->viewport(),
    not to the whole QAbstactScrollArea
  + njs_term: add save-to-file functionality
  - njs_term: fix: cleanup & refactor copying from the terminal
  - njs_log: fix: reset ConversionMgr on every moveConverterToTail_s,
    moveFilterToTail_s (even if not changed -- for consistency)
  + njs_log: add new functions for saving log range as text
  + njs_log: add new range processor: save selection as njlog

................................................................................

version 5.2.0 (2022-09-16)

  Major update. Introduces: system dark theme support, color themes in the
  terminal emulator, major improvements in the xterm compatibility, extended
  information about serial ports in all related plugins, support for *.njlog
  output in ioninja-hwc.

  Main application changelog:

  ! nj_hwc: add support for writing *.njlog files
  ! nj_app: support for the system dark theme
  ! nj_app: support for changing themes in terminal
  ! nj_app: add prev/next buttons to packet transmit panes (smart iteration over
    the packet history similar to bash)
  ! nj_app: terminal: add support for mouse tracking and mouse wheel, handle
    Alt + Key on macOS, and many other terminal compatibility improvements
  ! nj_app, nj_srv, nj_hwc: ignore SIGPIPE on POSIX
  ! nj_log: critical fix: incorrect iteration over m_conversionPipeline
  ! nj_app: critical fix: on macos, a stack-allocated instance of style was
    passed to QApplication (potentially causing a crash on exit)
  - nj_app: fix: kill overlay highlights in the hex editor before adding
    autorun-induced highlight(s)
  * nj_app: allow placing corner buttons into subwidgets
  + nj_app: add shortcuts to all relevant tooltips
  - nj_hwc: serial-tap: process line errors
  * nj_hwc: reuse standard serial enums from axl_io/io_Serial.h
  + nj_ui: add property: ui.ComboBox.m_itemToolTip
  * nj_app: before transmission, execute all autorun actions (and wait for
    completion)
  + nj_ias: add support for attribute [extraSize] (when a minimum packet size
    is bigger than the header size)
  + nj_log: add methods: Log::copyOriginalRecordFile, Log::copyFinalRecordFile

  Scripts changelog:

  ! serial: add manufacturer info and extended tooltips for serial combo box
  * serial-*: unify port enumeration code
  * all: redesign color system (as a part of dark theme support)
  - ssh: fix: "send" not disabled on error (error handling in ssh is refactored)
  + ssh: add support for reconnect
  * hwc: reuse standard serial enum values from io_base.jncx/io_Serial.jnc
  * process: default TERM to `screen-256color`
  + api: add property ui.ComboBox.m_itemToolTip
  - tcp-flow: typo fix: andress -> address
  - tcp-flow, udp-flow: typo fix: IPv6 headers were not properly decoded
  - tcp-flow, udp-flow: fix: invalid handling of Ethernet Tap records
    (PacketHdr is preceded with a 32-bit frame #)
  + packets: add `extraSize` attributes to appropriate Modbus packets
    (otherwise, auto-update CRC overwrites header bytes)
  + packets: add autorun method: ModbusRtuReadReplyPacket.updateCount()
  - pcap: fix: minor fixes after redesigning `exportToPcap`
  - websocket: fix: invalid access to property `jnc.RegexState.m_captureArray`
  * pcap, ethernet-tap: rename: io_LogToPcap.jnc -> log_exportToPcap.jnc

  Ninja Scroll changelog:

  ! njs_term: major redesign of the painting engine in log, hex-edit, and
    terminal widgets
  ! njs_term: use ragel for fast xterm sequence parsing
  ! njs_term: major improvements in xterm sequence processing  compatibilty
  ! njs_log: critical fix: don't update the final record file of the conversion
    pipeline while closing the server (potential crash)
  ! njs_log: fix: checker pattern was calculated incorrectly (edge cases not
    properly handled, particularly in bin-text)
  ! njs_cmn: support dark themes in log and hex-edit
  ! njs_log: line indices/counts are now 64-bit
  ! njs_log: critical fix: bugs in moveConverterToTail_s()/moveFilterToTail_s()
    caused mixup in the order of filters
  * njs_cmn, njs_term: prefer to keep the top of the fixed-sized console at the
    screentop
  * njs_term: draw a dotted border around fixed-size terminal consoles
  - njs_hexedit: fix: char wrap in overwrite mode didn't work properly

  Device Monitor changelog:

  ! dm_lnx_lkm: critical fix on ARM: pmdIdx selection based on addr and
    SECTION_SIZE

  QT Property Browser changelog:

  * qtpb: for links, use QPalette::Link instead of the hardcoded bright-blue
  * qtpb: clear Qt::TextColorRole if QProperty::valueColor is not set
  * qtpb: use QPalette::Button for grid lines (SH_Table_GridLineColor doesn't
    work well for the dark theme)

  Jancy changelog:

  ! jnc_io_base: fix: NetworkAdapterAddress used incorrect socket address
    structure that didn't work on macOS; as a result, the list of adapters in
    ioninja was missing address information
  ! jnc_ct: generate code-assist for async functions
  ! jnc_edit: add theme support
  - jnc_io_base: fix: link to libudev on linux
  - jnc_ct: fix: OperatorMgr::awaitOperator didn't handle missing code-gen
    properly
  * jnc_ct: check for empty closures (rather than assert)
  * jnc_io_base: add fields to io.SerialPortDesc: m_manufacturer,
    m_hardwareIds, m_driver, m_location
  + jnc_api: add method: jnc_Attribute_getValueVariant
  - jnc_ct: fix: don't add ScopeFlag_Nested to internal scopes for `disposable`
    variables (otherwise, `disposable` fails to compile inside `nestedscope`)
  - jnc_ct: fix: don't generate qualified names for declarations in scopes
  - jnc_ct: fix: don't add more values to a property closure than the property
    argument count
  - jnc_ct: fix: move check for hasCodeGen in OperatorMgr::castOperator()
    after prepareOperand()
  * jnc_rtl: remove constants from `bitflag enum RegexCompileFlags` (redundant
    now that we use `bitflag`)

  AXL changelog:

  ! axl_io: add extra fields to SerialPortDesc (manufacturer, hardware IDs,
    driver, location)
  ! axl_lex: add support for utf16_t and utf32_t in lex::Ragel
  ! axl_lex: add method Ragel::setSourcePart() to support chunk-by-chunk
    tokenizing
  ! axl_gui: removed the whole axl_gui module (heavily redesigned and integrated
    directly into njscroll)
  - axl_sys_win: fix: incorrect string length in
    DeviceInfo::getDeviceRegistryProperty (the returned size includes trailing
    null)
  + axl_sl: add typedefs: ArrayDetails::Value, ArrayRef::Value
  + axl_lex: add lex::QtRagelSyntaxHighlighter (previously,
    gui::QtRagelSyntaxHighlighter)
  * axl_sl: optimize sl::String::remove() to avoid copying when removing from
    index 0
  + axl_enc: add new functions: isMark(), isHiSurrogate(), isLoSurrogate(),
    isSurrogate()
  * axl_enc: enc::HexEncoding::encode can now emit string in any UTF encoding
  * axl_io: rename generateTempFilePath() -> createTempFile()

................................................................................

version 5.1.2 (2022-05-15)

  Introduces: new dispatch interface for exposing session-specific actions to
  IAS (in-app scripting), new IAS functions transmitAll() and receiveAll(),
  support for copying timestamps & binary offsets from the log and hex editor.

  Main application changelog:

  ! nj_app: add IAS dispatch interface for exposing session-specific actions
  ! package/msi: fix: missing conf/guest.pem (prevented offline guest sign-in)
  ! nj_ias_srv: add the "timeout" parameter to `receive()`
  ! nj_app: new: setting default layout (Menu -> View -> Reset Layout)
  * nj_app: suggest to "keep workstation signed in" for non-guest accounts
  * nj_app: flush account settings when app signin dialog completes successfully
  + nj_ui_srv: add method: ui.ComboBox.findData
  + nj_hwc: add cmd line option --ser-enum to enumerate serial ports
  - nj_app: fix: elide status text in file transmit pane
  - nj_app: fix: don't cause long file name to affec the min-width of the whole
    file transmit pane
  - nj_app: fix: incorrect handling of packet template changes (could cause
    cutting the hex-edit data)
  - nj_app: fix: don't process hex-edit changes if packet templates are
    disabled

  Scripts changelog:

  ! api/ias: add IAS dispatch interface
  ! usb-ctrl-ep: add the "claim interface" functionality (might be required
    when receipient is set to "interface")
  + api/ui: add method: ui.ComboBox.findData
  + common: add utility functions: findUsbInterfaceComboIndex,
    findUsbEndpointComboIndex
  - usb-ctrl-ep: fix: restore default properties didn't work correctly
  + usb: dispatch interfaces for "usb data endpoint" & "usb control endpoint"
    sessions
  + api/ias: add new functions: transmitAll() and receiveAll()
  + api/ias: add `timeout` parameter to receive()
  + udp: dispatch interface for the "udp" session
  + tcp-server: dispatch interface for the "tcp server" session
  + tcp: dispatch interface for the "tcp connection" session
  + serial: dispatch interface for the "serial" session

  Ninja Scroll changelog:

  ! njs_log: select & copy timestamps & offsets (ctrl + mouse click)
  ! njs_wdg: fix: incorrect processing of CSI Ps @ (insert blank) sequences in
    terminal widget
  - njs_wdg: fix: incorrect painting of overlay highlights when h-scrolled

  Jancy changelog:

  + jnc_edit: add property: QString jnc::Edit::extraSource()
  + jnc_api: add union field: jnc_Variant::m_data (to make size measurements
    more explicit)
  - jnc_ct: ImportMgr: fix: if import has an absolute path, don't try to find it
    in import dirs
  + jnc_api: add jnc_Module_addSourceImport()
  - jnc_ct: fix: FunctionMgr::epilogue should check the scope structure (might
    be broken after the error recovery)
  - jnc_ct: fix: Parser::parseTokenList should respect the result of
    parseEofToken()
  - jnc_io_base: fix: IoThreadFlag_Datagram was not properly set
  - jnc_ct: workaround: don't optimize functions with landing pads
  * jnc_api: in msvc16 and up, we can't take address of `setjmp` -- implement it
    in assembly
  - jnc_ct: fix: incorrect LLVM version check (in conditional compilation of
    lvm::DIBuilder::insertDeclare)

  AXL changelog:

  ! axl_gui: add support for color256 xterm CSI sequences
  - axl_sl: fix: sl::Array::insert() should check for count == 0
  + axl_sl: sl::Array: add methods for insertion of element duplicates:
    copy(e, count), append(e, count), insert(e, count)
  + axl_gui: add Engine::getMousePoint, mapGlobalToWidget, mapWidgetToGlobal
  + axl_io: add io::isAbsolutePath()
  * axl_io: add const qualifiers to io::SerialPortDesc

................................................................................

version 5.1.1 (2022-03-15)

  Service release. Critical fix for incorrectly reported Evaluation/Subscription
  due time on some Linux platforms, a few critical fixes in the new Log
  Colorizer, use the pre-release build of libssh2-1.10.1 to support RSA-SHA2
  required by openssh-8.8 and above, new feature: Guest Login.

  Main application changelog:

  ! nj_app: critical fix: don't store unix milliseconds in time_t which could be
    32-bit on some platforms (e.g., arm32)
  ! nj_app: new: Guest login (sign in without an account)
  ! nj_hwc: don't rely on libusb timeouts, they don't work reliably; instead,
    reduce the USB transfer block size (1K transfer, quad-parallelism)
  + nj_app, conf: add new capability: com.ioninja.log-colorizer
  + nj_srv: add sys::registerExceptionErrorProvider() as to avoid cryptic
    errors on exceptions
  * nj_ui: bounds-check in ComboBox::setCurrentIndex
  * nj_hwc: serial-tap: don't send last error on start
  * nj_app: don't show "promotion" status when on subscription or evaluation
  * nj_app: limit offline promotions (app tokens contain timestamps now)
  * nj_ias: validate buffer sizes in transmit()/receive()
  * nj_app: handle the situation when autoSignInKind is set to `cookie` but
    cookie is null (e.g., if previous version has cleaned the cookie and didnt
    touch autoSignInKind)

  Scripts changelog:

  ! ssl, common: pass hostname to the server (SNI)
  ! xmodem: fix: buffering of xmodem blocks in the xmodem receiver
  ! ethernet-tap: don't rely on libusb timeouts, they don't work reliably;
    instead, reduce the default read block size (max transfer size is 512,
    with 1K buffer and quad-parallelism we should be good)
  * common, ssh-*: rename: io_HwControllerProto.jnc -> io_HwcProto.jnc

  Ninja Scroll changelog:

  ! njs_log: fix: update leaf before suspending (otherwise, it's possible
    that the cache doesn't update until the next log record is added)
  - njs_log: fix: incorrect check for cross-page colorization trigger
  - njs_log: fix: incorrect assert on char-codec-state in
    ColorizationMgr::colorizerThreadFunc
  * njs_wdg: TerminalWidget should use UTF-8 by default

  Jancy changelog:

  ! io_ssh: use libssh2-1.10.1 (pre-release) to enable RSA-SHA2 required by
    openssh-8.8 and above

  AXL changelog:

  ! axl_re: critical fix: flatten sequences (the current design won't work with
    nested sequences)
  ! axl_re: critical fix: anchor transition map was not properly buit for the
    reverse DFA; major update of NfaStateSet::buildClosureImpl
  ! axl_io_ssl: add methods: io::Ssl::getHostname(), setHostname()
  * axl_re: initialize ExecEngine::m_prevChar
  - axl_re: fix: incorrect assert in re::Compiler::nonCapturingGroup()

................................................................................

version 5.1.0 (2022-02-23)

  Major update. Introduces new regex-based log colorizer, auto-calculation of
  packet template fields (such as checksums or length), new CLI-based client
  for IO Ninja hardware (ioninja-hwc), new plugins: Serial over SSH, Serial Tap
  over SSH, Ethernet Tap over SSH.

  Main application changelog:

  ! nj_app: new built-in regex colorizer to replace the Regex Colorizer plugin
  ! nj_ias, nj_app, nj_srv: autorun actions marked with the `autorun` attribute
    to automatically update checksums, packet length, etc.
  ! nj_app: critical fix: invalid sudo password attempts were not properly
    handled on Linux and macOS (leading to a locked-up application)
  ! nj_app: critical fix: Packet Library now uses the Base64 encoding for packet
    data; the previous implementation was lossy (on invalid UTF sequences)
  + nj_app: when plugins that require `sudo` are launched via the "New Session"
    drop-down menu, run them via `sudo`
  * nj_app: when in AppStore sandbox on macOS, hide the `sudo` checkbox on the
    New Session dialog and don't allow loading plugins that require `sudo`
  + nj_app: add keep-alive requests to update `date_refresh` on the server
    (now that we drop old app sessions)
  + conf: add Serial over SSH, Serial Tap over SSH, Ethernet Tap over SSH
  + conf: add HTTP server to the list of stock IAS scripts
  * nj_app: make script pane read-only on compile or run
  * nj_app: make user name bold in the sudo password dialog
  * nj_app: save plugin default settings on document close
  * nj_app: change focus policy for login dlg (don't tab-stop on radio-buttons)
  * nj_app: set sticky-scroll on clear-log
  - nj_log: fix: create a copy of the log record block for observers (those
    often are scheduled)
  * conf: packet template library divergence: Modbus.jnc -> ModbusRtu.jnc,
    ModbusTcp.jnc
  - nj_app: fix: bring transmit & info panes to front on show (before they
    remained at bottom when stacked)

  Hardware Client changelog:

  ! nj_hwc: new command-line client for managing IO Ninja hardware (Serial Tap,
    I2C/SPI Tap, Ethernet Tap); also supports Serial (so it can be used to
    control an attached serial port remotely over SSH)

  Scripts changelog:

  ! new plugin: Serial over SSH
  ! new plugin: Serial Tap over SSH
  ! new plugin: Ethernet Tap over SSH
  ! tcp-flowmon, tcp-flow: a major update of the TCP decoder
  - ssh: fix: don't pass process extra params to `shell` processes
  + pcap, tcp-flowmon, udp-flowmon: add `sudo` attribute (pcap-based plugins
    require sudo on Linux or macOS)
  - ethernet-tap: disable terminal (this is a packet-based read-only plugin)
  * ias: update the HTTP server sample
  - pcap: fix: attempted application of the capture filter to a closed device
  * protocols: rename: TCP "Windows size" -> "Window size"
  - common/ui: fix: SSH process type was not saved (cannot simply set m_value
    because it's a `char const*`)
  * packets: diverge Modbus packet templates (RTU vs TCP, request vs reply)
  + packets: add new attributes (displayName, fixedSize, autorun) to packet
    template libraries
  + protocols: add displayName attributes to Modbus declarations; use those
    attributes from Modbus plugins
  - serial: fix: update break condition
  * all: choose better session group names in the information grid

  Ninja Scroll changelog:

  ! njs_log: new regex colorizer based on the new AXL regex engine
  ! all: major update: port to the new AXL char codec architecture (the bin-text
    view should work much faster now)
  ! njs_log: major update of the implementation of check-pattern (must show
    record boundaries, not part boundaries)
  ! njs_log: redesign of the sticky-scroll implementation
  * njs_log: right-click in log sets cursor now
  + njs_wdg: add new method: HexEditWidget::addDiffOverlayHilite
  * njs_wdg: HexEditWidget::insertChar: replace encoded char buffer with a more
    explicit 'char[4]' (utf32_t is confusing)

  Jancy changelog:

  ! all: major update: port to the new regex engine implementation in AXL
  ! axl_io_usb: critical fix: on some backends, it's crucial to free libusb
    transfers before closing the USB device
  ! jnc_io_usb: critical fix: removeInterface/removeEndpoint incorrectly checked
    for non-null links before removing the item from the list
  - jnc_io_ssh: fix: when reconnecting, use the local or remote address family
    (previously, AF_INET was unconditionally used on reconnect)
  - jnc_io_base: fix: typo in handling read errors
  - jnc_ct: fix: override this-value in ArrayType::calcLayoutImpl (otherwise, it
    is possible to use unrelated Field-s)
  - jnc_io_base: remove duplicate update of serial status line events (already
    set in updateStatusLineEvents)
  + jnc_api: add attr-related methods: jnc_ModuleItemDecl_findAttribute,
    jnc_Attribute_getValueConstData, jnc_Attribute_getValueString_v,
    jnc_AttributeBlock_ensureAttributeValuesReady
  - jnc_std: remove std.BinTreeFindRelOp as it's now implemented via templates
    in AXL (and is not used in ioninja anyway)
  * jnc_ct: use sl::StringRef instead of sl::String for module item names
  * jnc_ct: EnumType must emit documentation about its base type

  AXL changelog:

  ! axl_re: redesign of the regex engine: Ragel-based lexer, DFA search engine,
    NFA engine for captures, full support for Unicode characters & Unicode word
    boundary anchors, the engine is applicable to streams
  ! axl_enc: redesign of UTF char codec engines: fast DFA-based forward and
    reverse decoders for UTF-8, UTF-16, UTF-32; the reverse decoder yields
    codepoint sequence isomorphic to the one produced by a forward decode even
    when replacement characters are emitted; decoders provide information about
    the number of "pending" code units
  ! axl_sl: use template parameters instead of runtime parameters in:
    sl::BinTree::find and sl::BitMap::merge to template args
  ! axl_sl: remove bool parameters from sl::BitMap::findBit/setBit/setBitRange;
    instead, provide explicit members set/clear/find/findZero
  + axl_mem: add mem::Pool::clear
  + axl_sl: add getters for sl::CircularBuffer: getBuffer, getReader, getWriter
  + axl_g: AXL_TRACE on windows is now redirectable to a file
  * axl_gui: remove in-loop buffer checks in TextPainter::buildBinTextBuffer()
    instead, pass an oversized buffer; pad the buffer in case of an incomplete
    trailing codepoint
  * axl_gui: opt: make shortcuts in TextAttrAnchorArray::overlay inlinable
  - axl_sl: minor style fixes for Boyer-Moore (still need to clean-up
    and employ the new buffer-less utf32 decoder)
  + axl_gui: add gui::TextAttrAnchorArray::setTailAttr
  * axl_sl: rename: sl::String::setReducedLength -> overrideLength
  * axl_sl: minor opt in sl::String::reserve(), ensureExclusive(), getBuffer()
  + axl_enc: add enc::isWord (letters, numbers, connecting punctuation)
  * axl_sl: add forceCopy to sl::Array & sl::BitMap
  * axl_sl: remove template arg from sl::True, sl::False (always `bool`)
  + axl_sl: add HashTable::operator [] const
  + axl_sl: add ASSERT(m_p) in Iterator::operator -> ()
  * axl_rc, axl_sl, axl_enc: minor updates re move semantics
  - axl_sl: fix: add missing constructor for ConstRbTreeIterator:
    ConstRbTreeIterator(const Iterator<RbTreeNode<Key, Value> >& src)

................................................................................

version 5.0.4 (2021-09-29)

  Service release. Critical fix of a rare deadlock on heavy load, added missing
  io_websocket.jncx to the MSI package, coding style in all scripts changed
  from Allman to K&R.

  Main application changelog:

  ! msi: add missing io_websocket.jncx to the MSI package on Windows
  + nj_app: add command line option -c (--connect) to connect a session
    immediately after startup
  + nj_app: add command line option -s (--script <filename>) to load and run
    a script file immediately after startup
  - nj_app: prevent auto-resize of the Save Session dialog (could have caused
    annoying window resizing when typing)
  - nj_srv: don't write log detailizer errors to the system log (e.g., when
    TCP Flow Analyzer is attached to Pcap Session)

  Scripts changelog:

  ! style: Allman -> K&R variant (same-line opening braces)
  - tcp, ssl, websocket: fix: incorrect reconnect logic (reconnect stopped after
    the first failed reconnect attempt)
  - all: fix: set appropriate errors in transmit() when session state is
    invalid; otherwise, we get confusing errors in the in-app scripting pane
  + common: add a checksum calc for XOR-8
  * post-it: don't write empty tags to log
  * common: don't add empty strings to history
  * generic-serial-tap: update error string when DTE is the same as DCE

  Jancy changelog:
  ! jnc_dll: version bump to 1.9.0 (SONAME must be updated due to many ABI
    changes since 1.8.7)
  * jnc_edit: update auto-completion of "prototype" functions for the new K&R
    brace style

  Ninja Scroll changelog:

  ! nj_log: critical fix: rare deadlock in inter-process read-write locks on
    heavy load

  AXL changelog:

  ! axl_sys: don't return bool from ReadWriteLock::readLock/writeLock; fall back
    to spin-locking on a wait failure

................................................................................

version 5.0.3 (2021-09-17)

  Service release

  Main application changelog:

  ! nj_app: eliminate the flash appearance of the restore sign-in dialog during
    startup. sign in in the background; only show the restore sign-in dialog on
    errors
  ! nj_app: fix: on macOS, require the light (Aqua) appearance
  ! nj_app: fix: on Linux, remove the build RPATH from the main executable
  - nj_app: fix: a crash on quit from the main sign-in dialog when there are
    open documents
  - nj_app: fix: on macOS, don't register IAPs when not sandboxed
  + conf: create a new plugin group: IO Ninja Hardware (for Serial, I2C/SPI, and
    Ethernet taps)
  - nj_app: don't sort plugins (turns out, it makes it harder to find what you
    need; the manually ordered list works better)
  - nj_app: fix: don't save update notification settings unless the user clicked
    the OK button
  - nj_app: remove the initial Privacy setting dialog during the first startup -
    it is irrelevant now (we never connect to the server without an explicit
    user's permission; when installed from the AppStore, we don't even sign-in)
  * nj_app: simplify the update.conf (now that we don't fetch update manifests
    from the server)
  + nj_app: raise the sign-in window to the top after a successful sign-in
  - nj_app: fix: broken profile links

  Jancy changelog:

  - jnc_io_websocket: typo fix: bool -> size_t; could cause potential errors
    during parsing of handshake headers

................................................................................

version 5.0.2 (2021-09-07)

  Service release (macOS AppStore only)

  Main application changelog:

  ! nj_app: critical fix: in-app purchases of `com.tibbo.ioninja.personal` made
    in previous versions of ioninja were not handled properly (affects AppStore
    users only)

................................................................................

version 5.0.1 (2021-09-03)

  Major update. Introduces capability & subscription ecosystem, personal and
  workgroup accounts, WebSocket client and server plugins, support for custom
  baud rates on Linux and macOS, lossless observers in Ninja Scroll, compiler
  pragmas in Jancy, extended POSIX signal and Windows exception information
  availble in Jancy catch-handlers, Device Monitor updates for recent Linux
  kernels.

  Main application changelog:

  ! nj_app: capbility & subscription subsystems
  ! nj_app: account subsystem; sign-in via web-browser or via token
  ! nj_app: redesign of update notifications
  ! nj_log, nj_srv: count TX/RX stats in the main log writer; access it through
    PluginHost.m_txRxStats. This way, we can avoid adding log observers and
    guarantee lossless stats with or without converters/filtes in the pipeline
  ! nj_app: major style fixes/updates for macOS
  ! nj_app: Find Next (F3) and Find Prev (Shift+F3) shortcuts now work without
    the need to open the Find dialog beforehand
  ! nj_app: critical fix: use special names for mappings & events when inside
    the macOS sandbox
  ! nj_app: opt: only enable RX pumping when terminal is visible or there is a
    session link
  ! nj_doc: critical fix: Plugin::transmitNext MUST create a new call-site
    with the proper runtime; calling JIT-ted code with a wrong runtime might
    lead to gc-heap corruption, use-after-delete, and all kinds of issues
  ! nj_app: critical fix: potential crash on dangling template pointer; saving
    binary property page could have left a dangling template pointer in the
    combo box
  - nj_app: fix: packet-template-widget mistreated bigendian enums (hex-edit to
    property-browser)
  - nj_app: fix: packet contents in the Transmit Pane was lost after closing
    the last document, then opening a new one
  - nj_app: fix "weird" button collapse in the main toolbar
  + nj_app: add documentation & forum links to the Help menu
  - conf: fix: add EthernetTapLog.njplg to the std plugin list (otherwise,
    opening EthernetTap logs in a freshly started IO Ninja doesn't work)
  * nj_app: when a representer is not found, show its GUID
  * nj_app: use "unknown" progress bar when we are rebuilding log with a
    non-null conversion pipeline
  * nj_app: maintain three sets of dock-states (for logs, read-write sessions,
    and monitor sessions)
  * nj_srv: opt: don't add RxObserver by default; manually add/remove it as
    necessary (e.g. for terminal, session-link)
  * nj_app: sort plugins (unlocked first, then locked)
  * nj_app: don't rely on QByteArray::toBase64 (QByteArray::Base64UrlEncoding)
    which is only available in QT-5.2+
  + conf: add devicemon-log plugin to macos packages
  - nj_app: qt-5.0.2 compat fixes
  * nj_srv: use session/layer class names as module tags
  * nj_ui: require std.HashTable from ui.DictionaryProperty
  * nj_app: force-sync .njcfg files
  * nj_app: center password dialog over session startup progress
  * nj_app: remove custom escape encoding in TextTransmitEdit, use the new AXL
    enc::EscapeEncoding facilities
  - nj_app: fix: apply escape encoding on the resulting packet (after codec)
  + nj_app: add new setting: show whitespace chars
  - nj_app: fix FileTransmit::updatePreview for empty filenames
  * nj_app: don't re-use file scripts in new sessions, but do keep non-file
    (temp) scripts
  * package-msi: rename program directory (Ninja 3 -> IO Ninja) -- we are
    bumping major version to 5
  + nj_app: add DigiCert Root EV CA (apparently, on some machines it's missing)

  Scripts changelog:

  ! new plugins: websocket-client & websocket-server
  ! regex-colorizer: critical fix: partial match IMMEDIATELY after a quantified
    match yielded wrong retro-colorize offsets
  ! servers: critical fix: when transmit is not completely buffered, wait for
    client events (otherwise, we might miss the WriteBufferReady event)
  + ias: add http-server
  * all: use the new pragma(Alignment) directive
  + common: add CRC8-CCITT
  * serial: don't report "unknown-driver" and fall back to conservative unless
    the driver is in the list)
  * all: major update: Listener -> Observer, use TxRxStats, LogDocument
  * ez-tap-pro: change name to "Stratus EZ-Tap Pro" (so it's not
    the first on the list when sorted)
  + serial: show status line changes for DCD & RI
  * all: don't restart waiting for WriteBufferReady
  * replay: allow broken records (but not in the beginning of the
    log)
  + replay: add replay-count and interval-scale parameters
  * common: ui.SslPropertySet should take ui.Property*, not io.GroupProperty* as
    a parent
  * common: sockets ui should allow adjusting the default remote address
  * ssl: rename SslLogRecordCode.SslConnectionCompleted -> SslConnectCompleted
  * all: update re latest jancy extensions updates (extract common events &
    options into base enums)
  * serialmon: support TCSETS2 (termios2 with custom baud rates)
  * serial-tap: maintain the currently opened device name
  * serial: rename SerialLogRecordCode.PortClosed -> PortClosedNamed,
    add SerialLogRecordCode.PortClosed (unnamed) and use it in all official
    serial-based plugins
  * pcap: remove "Wireshark file" from all Pcap device dropdowns

  Device Monitor changelog:

  ! dm_lnx_lkm: support read_iter/write_iter
  ! dm_lnx_lkm: check fops for null before forwarding
  - dm_lnx_lkm: fix page protection removal on arm (linux 5.10+)
  - dm_app: fix: missing string for dm_NotifyCode_DataDropped

  Ninja Scroll changelog:

  ! njs_log: major redesign: replace Listener-s with Observer-s, support
    lossless observers (when suspended, record file is locked so that no new
    records can be added)
  ! njs_log: major redesign of rebuild-completion detection in case of
    non-null conversion pipeline
  - njs_wdg: clear 4-bit cursor flag on kill-focus
  * njs_log: pre-rebuild initialization (scroll to the top, set rebuild
    flag, clear sticky scroll flags)
  - njs_log: don't retro-colorize cross-pages (kills performance)
  - njs_log: typo fix: removeAllDetailizer_s -> removeAllDetailizers_s
  + njs_log: support moveFilterToTail/moveConverterToTail
  + njs_log: support upgrade/downgrade for read-write locks
  * njs_log: reset folding filters
  + njs_log: support record file format v3.0.1
  * njs_log: handle broken records (need to improve even further)

  QT Property Browser changelog:

  * qtpb: make label inside QtDictionaryEditWidget clickable
  * qtpb: emit change events from QtEnumEditotFactory even if the value has not
    changed (e.g., for forcing values in packet template editor)

  Jancy & Graco changelog:

  ! jnc_websocket: new extension library for websockets
  ! jnc_ct: major update: compiler pragmas (for now: Alignment, ThinPointers,
    ExposedEnums)
  ! jnc_ct: ptr-operator on 'dynamiclib'-s translates to member-operator for
    member 'lib'
  ! jnc_rt, jnc_api, jnc_ct: major update: save extended exception information
    (both Windows and POSIX)
  ! jnc_ct: clean-up cast operator resolver (shouldn't set errors on conflicts)
  ! graco, llk: move catch nodes to a separate stack
  ! graco: support catch(eof) -- required for code-assist
  ! jnc_ct: add catch(eof) to pass-1 expressions -- critical for code-assist in
    initializers
  ! jnc_rt: critical fix: nesting runtimes didn't work
  ! jnc_io_ssl: major refactoring (extract SSL socket common code to be shared
    between SslSocket & WebSocket)
  ! jnc_io_base: implemented waiting for serial status line changes on Linux
    (TIOCMIWAIT)
  ! jnc_ct: critical bugfix: zero-initialize all static variables (except for
    const and externally mapped ones)
  ! jnc_api, jnc_ct, jnc_dll: capability checks & management
  ! jnc_api, jnc_ct, jnc_dll: add optional code authentication for dynamic
    extensions
  - jnc_ct: compat fix: some versions of clang report ambiguous call to
    overloaded constructor Value::Value(...) in ControlFlowMgr::setJmp()
  + jnc_edit: set axl module tag
  - jnc_mini_ide: fix axl module tag
  - jnc_api: c-compatibility fix in JNC_CALL_SITE_xxx
  - jnc_api: don't restore SJLJ frame if it already is restored
  * jnc_ct: assert success of conditionalJump from ControlFlowMgr::setJmp
  - jnc_ct: typo fix in statement_sync: TokenKind_Reswitch -> TokenKind_ReSwitch
  - jnc_ct: warning fix: false-vs-null in ct::OperatorMgr::createClosureObject()
  - jnc_ct: fix: typo in ct::OperatorMgr::getValueFunctionTypeOverload: invalid
    closure function-ptr base arg idx
  - graco: typo fix in NodeMgr::indexBeacons
  - graco: remove unused variables
  - graco: warning fix: false-vs-NULL in Parser::resolverSpecifier()
  + jnc_io_base: add property io.Serial.m_updateInterval
  * jnc_stdlilb: update .forced.jnc
  + jnc_api: add jnc_Module_getName
  * jnc_std: require std.MapEntry from std.HashTable & std.RbTree
  - jnc_io_ssl: regression fix: accepted socket io thread was not started
  * jnc_io_cmn: minor refactoring of AsyncIoDevice::bufferedWrite/
    addToWriteBuffer
  * jnc_io_ssl: move SslSocketEvents to a separate file
  * jnc_io: put overlapped struct back to pool immediately (was causing memory
    leaks in some IO classes)
  + jnc_api, jnc_ct, jnc_rtl: add requireOpaqueItemsFunc pointer to opaque
    classes (this should replace external return type set)
  * jnc_api: use DualString (axl::sl::String + jnc::DataPtr) for convenient
    string generation and caching GC heap pointers
  + jnc_api: add utility: struct DualString (mainain both axl::sl::StringRef
    and cached jnc::DataPtr)
  * jnc_io_xxx: extract common options & events and inherit from base enums
  + jnc_ct, jnc_api, jnc_edit: support enum inheritance
  + jnc_io_ssl: allow external creation of io.SslState (e.g. from websockets)
  * jnc_io_cmn: save overflow write data for datagram devices
  * jnc_ct: propagate POD flag in TypedefShadowType (important for code-assist)
  * jnc_ct: fast-exit from appendFmtLiteralBinValue if no codegen
  - sample: fix: 90_SslSocket.jnc
  * samples: pass_c/pass_cpp: update sample jancy code (formatting out-of-range
    char pointer now yields empty string)
  * jnc_io_ssl: regression fixes
  * jnc_ct: fast-exit from await operators & async sequencers if no codegen
  - jnc_rtl: fix: properly handle pointer's end-of-range in formatting literals
  - jnc_io_usb: fix: incorrect check before removing USB iface from the device
  + jnc_sys: make sys.Event.wait & sys.NotificationEvent.wait interruptible
    (so that Runtime::abort can abort waiting threads)
  - jnc_api, jnc_ct: fix: Function::isUnusedExternal should check m_llvmFunction
    directly
  * jnc_ct: ensure layout of the target type before cast
  - jnc_io_ssh: typo fix: PTY-less mode didn't really work due to an incorrect
    check (0 vs LIBSSH2_ERROR_EAGAIN)
  + jnc_io_usb: implemented vid/pid-based access restriction to usb devices
  * jnc_io_cmn: moved enum SocketOption to io_SocketBase.h
  - jnc_api: remove unnecessary JNC_EXPORT_O (only relevant when building
    jnc_dll)
  + tools/sign-jnx: implemented sign-jncx for linux (via elfsign)
  * jnc_io_base: simplify generation of stdio pipe names

  AXL changelog:

  ! axl_sys: critical update: new implementation of sys::NameableEvent on macOS
    PTHREAD_PRODCESS_SHARED doesn't work reliably on Darwin, so the traditional
    pthread_cond + pthread_mutex approach in shared memory doesn't work well
  ! axl_io: critical fix: custom baud rates on Linux
  ! axl_sys_ca: added a new library for cross-platform code authentication
  ! axl_sec: added a new library axl_sec (Darwin Security Framwork wrappers)
  ! axl_io: critical fix: pass correct size to axl::io::psx::Mapping::unmap()
  + axl_sl: add overload sl::CmpBin::operator(const T*, const T*)
  + axl_sys: add ExceptionError (to save exception information)
  - axl_gui: typo fix in WidgetScrollBar::WidgetScrollBar
  - axl_spy: typo fix: unnecessary assignment in conditional operator in
    hookEnterCommon
  - axl_sys: typo fix: incorrect check of the dlinfo result
  * cmake: import_xxx should check if lib-dirs were auto-detected
  - axl_sys: warning fix: false vs NULL in DynamicLib::getInfo()
  * axl_io: NT native functions returns NULL as an invalid handle value, not -1
  + axl_sys: on windows, add missing intrinsics for InterlockedExchangeAdd
  + axl_sys: add sys::atomicAdd
  + axl_sys: add sys::ReadWriteLock::upgrade/downgrade
  * axl_io: use ptsname instead of ptsname_r on osx
  * cmake: check the presence of opensslconf.h
  * axl_mem, test: use MAP_ANON instead of MAP_ANONYMOUS (better compatibility)
  + axl_sl: add method sort() to List, BoxList, HashTable
  - axl_ref: fix: incorrect assert in ref::Buf::operator -> ()
  * axl_err: allow overriding error router
  + axl_enc: add Base64Encoding, fix Base32Encoding, rename old (incompatible)
    implementation to Base32Encoding_nj (used for legacy ioninja product keys)
  - axl_sl: fix: AXL_SL_BEGIN_STRING_HASH_TABLE_IGNORE_CASE was broken
  + axl_enc: add encoding flags to enc::EscapeEncoding
  * axl_enc: isprint -> utfIsPrintable
  + axl_enc: added enc::EscapeEncodingDynamic (with a CharCodec*)
  * axl_enc: not necessary to check for reserve() result
  * axl_sl: ensure exclusivity in sl::Array & sl::String in non-const indexers
  + enc: EscapeEncoding now supports all UTF encodings (not just UTF-8)
  * axl_enc: refactor API of enc::CharCodec
  * axl_cry: rettype: const sl::String -> sl::String
  - axl_sys_win: fix: RegCloseKey returns LONG (error), not BOOL (success)
  + axl_cry: add axl_cry_Pem.cpp/.h with cry::encodePem/cry::decodePem
  * axl_cry: use failWithLastCryptoError/completeWithLastCryptoError wherever
    possible
  * axl_sl: only allow Handle::p() on empty handles
  - axl_io: fix: don't directly assign mmap to m_p (mmap returns -1 on failure,
    not NULL)
  + axl_io, axl_sys: added success-ASSERTs to ctors/dtors

................................................................................

version 3.15.1-a (2020-12-20)

  Service release

  Main application changelog:

  - nj_app: fix: dock state for the script pane was not properly serialized
  - package/msi: fix: missing conf/ias.conf
  - package/msi: typo fix: file type name ioninja.npkt -> ioninja.njpkt

................................................................................

version 3.15.1 (2020-12-18)

  Introduces: new packet library & packet history panes; major improvements in
  script file management; the ioninja-server system log is viewable from the
  main app; synchronous `receive` function added to in-app scripting

  Main application changelog:

  ! nj_app: add packet library & packet history panes
  ! nj_app: removed history up/down buttons (now that we have a dedicated packet
    historty pane)
  ! nj_app: new design of in-app script file management
  ! nj_ias_srv: implemented synchronous 'receive'
  ! nj_ias: allow omittnig 'main' if 'onLogRecord' is present
  ! nj_srv: support multiple compilation errors when ioninja-server is run
    from the IDE
  ! nj_app: major improvements in dock-state persistency
  ! nj_app, nj_srv: add system log viewer (very helpful for script debugging)
  * nj_app: for read-only jancy-edit: use simple grey color & disable current
    line highlighting
  * nj_app: adjust the default size for the packet template editor
  + package/msi: add a new file type: *.njpkt (IO Ninja Packet Library)
  + conf: add ias.conf (stock in-app scripts)
  + nj_app: add the 'Copy As' submenu to HexEditWidget
  - nj_app: fix: disable/unable link/unlink buttons on the 'Link Session' dlg
  * nj_app: override copy/paste in the text-transmit-pane to properly handle
    escape sequences

  Scripts changelog:

  ! api: add declaration: `size_t errorcode receive(void const* p, size_t size)`
  ! ssl-server: critical fix: set ephemeral DH/ECDH parameters even when we have
    a certificate (required for certain cipher suits)
  * df1: moved DF1 proto declarations to protocols/io_Df1.jnc
  + samples: add TutoProto analyzer
  * common: add default binPartRecordCode = 0 for representStruct()
  * common, plugins, samples: updates re latest changes in jancy
    regex engine
  + samples: add PostIt plugin as a sample (allows adding plain
    text notes to the log)

  Device Monitor changelog:

  ! tdevmon: release 3.3.8 (linux-only)
  ! dm_lnx_lkm: critical fix: __force_order was removed in linux-5.9.2

  Jancy changelog:

  ! jnc_rt: save/restore EXCEPTION_REGISTRATION in jnc_setJmp/jnc_longJmp on
    win-x86
  ! jnc_ct: add support for function-ptr & property-ptr const-casts
    (cructial when function pointers are stored in variants)
  + jnc_api: add jnc.Function.isUnusedExternal
  - jnc_ct: fix: ptr type flags for function ptrs and property ptrs were not
    applied
  * jnc_ct: convert function-ref to function-ptr in cdecl vararg
  - jnc_ct: fix: only fall back to llvm cast from a failed const cast if there
    is codegen
  - jnc_rtl: fix: don't rollback jnc.RegexState unless we are in the lexer-mode
  * jnc_ct, jnc_rtl: replace jnc.RegexState.m_isIncremental ->
    jnc.RegexState.m_flags
  + add jnc.RegexStateFlags.Lexer (matches final DFA state immediately)
  * jnc_ct: Value::setType(TypeKind_Void) should set m_valueKind to
    ValueKind_Void
  * jnc_ct: reset argument tip stack on skipped tokens during synchornization
  * jnc_ct: use 'char const thin*' instead of 'char thin*' in
    Parser::appendFmtLiteralValue
  + jnc_ct: add cast ops for typedef shadow types (for code-assist)
  + llk: add overridables: onSynchronizeSkipToken, onSynchronized

  Ninja Scroll changelog:

  ! njs_log: critical fix: setting font didn't update base col (thus leading to
  ! njs_log: critical fix: UiFlag_Rebuilding may have been set AFTER IndexMgr
    completed rebuilding (due to delayed CacheMgr::updateUi)
  ! njs_log: handle allocation failures in copy-processor (logs may be huge)
  + njs_wdg: add HexEditWidget::copyBin(CopyBinKind)
  * njs_wdg: move the copy-bin logic into a common file (njs_CopyBin.h)
  + njs_log: add LogWidget::ensureVisibleLine() and use it from
    CacheMgr::onRepresentPageCompleted()
  - njs_log: typo fix: implicit cast size_t -> bool (should check for -1
    instead)
    bogus cursor placement)
  + njs_log: add internal trace engine for debugging

  AXL changelog:

  ! axl_ini: support line continuation for values
  * axl_gui: gui::Engine::writeClipboard should use sl::ArrayRef, not sl::Array

................................................................................

version 3.15.0-b (2020-11-01)

  Service release

  Main application changelog:

  * package: set executable permissions for both libjancy and libjancy-edit,
    but only on linux, not on macos
  - qtpurchasing: remove NSLog on successful product registration
  - nj_app: remove debug printf when testing bundle builds with _NJ_APP_BUNDLE

  Jancy changelog:

  - jnc_edit: fix: remove rpath
  - jnc_edit: fix: replace printf-s with TRACEs in code-assist-thread

................................................................................

version 3.15.0 (2020-10-30)

  Introduces: the macOS AppStore version is now free for download with in-app
  purchases, code-assisting Jancy editor, support for compile error recovery in
  the Jancy compiler, new DF1 protocol analyzer, propagation of connect and
  disconnect states across linked sessions, critical fix on Linux (crash when
  ioninja is run with QT-5.15.x)

  Main application changelog:

  ! nj_app: use QT Purchasing for in-app-purchases on macOS
  ! nj_app: use jnc_edit for script editing
  ! nj_app, nj_srv, nj_ias: turned script transmit page into stand-alone IAS
    (in-app-scripting) script pane
  ! nj_app: crashes due to QT static being exported from the resulting
    executable because of mixing POSITION_INDEPENDENT_CODE/-fPIC/-fPIE
  - nj_ias: fix: if runtime was aborted, suppress the error message from
    onLogRecord()
  * nj_app: when we press "scroll-to-bottom", force-set sticky scroll (even
    when not scrolled)
  - nj_app: fix: only save transmit/script pane states for sessions (otherwise,
    opening log hides those panes for all upcoming sessions)
  * nj_app: jump to the error line in the script widget
  + nj_ias, nj_srv: add function clearLog()
  * nj_ias: abort IAS-scripts on error in onLogRecord()
  * nj_app: save script source before running (code-assist is not stable ebough
    just yet)
  * nj_app, nj_ias: don't let OK-close PacketTemplateEditDlg on errors (parse
    and wait before closing the dialog)
  - nj_app: fix: don't deactivate the MDI child if there are still open
    documents: on macOS, we receive notification on subWindowActivated(NULL)
    when MainWindow loses focus
  - nj_app: fix: case sensitivity in history combos (find-dlg, address-bar, etc)
  - nj_app: fix: serialize state of information/transmit/script panes
  + nj_app: add toolbar icons for convenient show/hide of information/transmit/
    script panes
  + nj_app: add load/save-as toolbars to packet-template edit dialog and script
    pane
  * nj_srv, nj_doc: make syncConnect wait for the SessionConnectionState
  * nj_srv, nj_etx, nj_cmn: improved script transmit API (don't endlessly
    queue transmit block, allow connect/disconnect/write-to-log)
  * nj_app: don't hide transmit panes for linked sessions (so we can inject)
  + nj_app, nj_cmn, nj_doc, nj_srv: added protocol messages and implementation
    for m_sessionConnectionState/connectSession/disconnectSession
  - nj_app: fix: cloning menus did not preserve titles
  - nj_app: fix: EditLogBinMenu was not properly disabled when in context menus

  Scripts changelog:

  ! api: add property doc.Session.m_sessionConnectionState
  ! pipe, file, ssl, udp, tcp, ssl-server, tcp-server, serial: implement
    m_sessionConnectionState/connectSession/disconnectSession
  ! udp: critical fix: buffer size was not applied (as a result, on the first
    run of UDP Socket there was a barrage of 0-sized packets)
  + ias: added samples for echo-server and saving-to-file
  + odsp: added the recently created skeleton for osdp analyzer as a sample
    plugin
  + api: add overload log.Writer.write(char const*) -- use
    log.StdRecordCode.PlainText
  + api: add function clearLog()
  + api: add the 'prototype' attr to in-app-scripting entry points (so that we
    can conveniently auto-complete those)
  * tcp-flow, udp-flow: should be pure-layers (attachable to logs)
  * api: rename tx.jnc -> ias.jnc
  * api: extend transmit api (add sync-transmit/connect/disconnect/log-write)
  * plugins: use log.RecordCodeFlags.Foldable instead of the 0x8xxxxxx prefix
  + df1: iniitial commit of DF1 analyzer (Allen-Bradley PLC protocol)
  - file, jlink, pipe, process, ssl, tcp, udp: typo fix: m_isTransmitEnabled
    was (incorrectly!) enabled on each IO event
  * pipe-server, ssl-server, tcp-server: update session ids
  - tcp, ssl: fix: don't change m_sessionConnectionState after resolve (i.e.,
    we are still connecting)

  Device Monitor changelog:

  ! tdevmon: release 3.3.7
  ! package: bundle msvc10 runtime (otherwise, possible runtime error on
    windows 10 which sometimes misses msvc10 runtime)
  ! package: link msi-actions dll against libcmt (otherwise, possible install
    error on windows 10 which sometimes misses msvc10 runtime)
  + package: install dm_MachineIface.h
  * dm_win_lib: build a libcmt twin for dm_win_lib (for the msi action dll)
  * dm_app: turn stdout buffering off when monitoring on windows (on linux, it
    was already off)

  Jancy changelog:

  ! jnc_api, jnc_rt: added jnc_setJmp/jnc_longJmp (ensure no unwinding during
    SJLJ)
  ! jnc_edit: new code-assisting editor component for QT (based on
    QPlainTextEdit)
  ! jnc_ct: support for error recovery and parsing with code-gen disabled
  ! jnc_io_ssh: critical fix: authenticate didn't clear private key if null was
    passed; hence, it was not possible to switch from private-key-auth to
    password-auth
  + jnc_io_base: add functions: io.getTempDir(), io.getHomeDir()
  * jnc_ext: release assertion string before throwing (destructor will not be
    called)
  - jnc_ext: fix: add import "io_SocketAddress.jnc" to io_NetworkAdapter.jnc
  - jnc_ct: fix: adjust m_storageKind for class member functions
  - jnc_io_base: fix: io.ChildProcess on windows should use time-based pipe
    names (as to avoid the all-pipe-instances-are-used error)
  - jnc_io_base: fix: io.ChildProcess on windows should use SW_SHOWNORMAL and
    NOT use CREATE_NEW_CONSOLE
  * jnc_ct: allow member operator in the dynamiclib.lib namespace to return a
    non-function value
  - jnc_ct: fix type string generation for reactor class types
  * jnc_ct: move error-code check from DeclTypeCalc to FunctionType::calcLayout
  * jnc_api: set jnc_TypeKindFlag_ErrorCode for jnc_TypeKind_TypedefShadow
  * jnc_app: move to the 'tools' source group
  * jnc_app: print failing source dirs (-S switch)
  * jnc_ct: always cast integer -> floating point implicitly
  - jnc_ct: fix: result types of integer arithmetic operators (e.g. -65535
    should be int32_t, not uint32_t)
  * jnc_ct: ignore unimplemented prototypes while processing the require-set
  - llk: remove the cryptic "add a 'catch' clause to the grammar" error
  * jnc_ct: update synopsis generation for aliases, functions & properties
  * jnc_ct: accept typedef shadows as enum base-types
  * jnc_ct: replace prototypes when adding functions to a namespace
  * jnc_ct: adjust sync-set for statements
  * jnc_ct: support typedef shadow in type operators (for code-assist)
  * jnc_ct: ensure alias is resolved before accessing its type
  - jnc_ct: fix: setCastError didn't handle 'void' values properly (Type* of
    'void' may be NULL)
  * jnc_ct: don't fast-exit from Module::parseImports
  - jnc_api: fix: getNextImportDir should use it.getEntry()
  * jnc_ct: ensure type layout before getting a field
  * jnc_ct: prevent broken scope structure on errors
  + jnc_ct: support 'null' as an attribute value
  * jnc_api, jnc_ct: make compile-error-count-limit freely adjustible
  * jnc_app: make disable-code-gen controllable from command-line
  * jnc_ct: make disable-code-gen a compile-flag

  Ninja Scroll changelog:

  ! njs_wdg: support insert/overwrite xterm modes
  ! njs_wdg: critical fix: backspace at the beginning of line  should move
    cursor *before* to the last char on the prev line
  ! njs_wdg: critical fix: reset scroll region on \e[r
  - njs_wdg: warning fix (signed-vs-unsigned comparison)
  * njs_log: don't update sticky-scroll on every key/mouse press, only when
    the cursor position actually changes
  * njs_wdg: use m_consoleSize.m_width_u instead of now-removed
    TerminalScreenBuffer::getConsoleWidth()
  * njs_wdg: reset insert-mode during hard-terminal-reset
  - njs_wdg: fix: don't zero console-width during terminal-reset
  - njs_wdg: fix: terminal widget should reset char set and insert mode
    on csi-soft-reset
  - njs_log: typo fix: jancy literal terminator should be a string-literal
    (not char-literal)

  AXL changelog:

  ! axl_io: critical fix: if the initial GetAdaptersAddresses failed with
    ERROR_BUFFER_OVERFLOW, the buffer was not reallocated, resulting in an
    invalid memory access
  ! axl_gui: added gui::QtRagelSyntaxHighlighter (ragel-based syntax highlighter
    for QT (derived from QSyntaxHighlighter)
  + cmake: on msvc, build limcmt twin libraries (by default, for axl_core &
    axl_io) -- required when we can't afford MSVC CRT dependencies
  + axl_io: add function: io::getHomeDir()
  + axl_cry: add support for IAP receipts in AppStore receipt validation
  + axl_err: add overloads ErrorRef::ErrorRef(string)
  + axl_sl: added overloads sl::String::isPrefix(C c)/isSuffix(C c)
  + axl_lex: added Token::m_flags (union-ed with m_channelMask)
  + axl_lex: added method lex::RagelLexer::setLineColOffset
  + axl_lex: added struct lex::LineColOffset
  * axl_lex: extracted lex::Ragel from lex::RagelLexer (so it can
    be shared with gui::QtRagelSyntaxColorizer)
  + axl_cry: added decoding for app store receipt creation/expiration dates

................................................................................

version 3.14.4 (2020-07-27)

  Service release

  Main application changelog:

  ! nj_app: fix: incorrect version displayed and used on Linux/macOS (regression
    introduced in ioninja-3.14.3)
  * nj_app: when sandboxed (macOS), show an info message before asking the user
    to select the base session dir
  * nj_app: when sandboxed (macOS), don't check for updates
  * nj_app: save last save-log/save-session dirs (bookmark save-session-dir
    when sandboxed)

  Scripts changelog:

  ! pipe-mon, mailslot-mon: apply capture filter during capture
  ! tcp-flow, udp-flow: preserve original timestamps on convert
  * tcp-flow: ConnectionPickedUp should use INFO color (not to confuse with
    Connected/Disconnected)
  * pcap-log: CaptureStarted/CaptureStopped should use INFO color (so not to
    confuse with Connected/Disconnected)
  - pcap-log: typo fix: logical && in SetCaptureFilter
  + devicemon-log: added DeviceMonLogRecordCode.SetCaptureFilter
  + common: added method iox.Monitor.setFileNameFilter (so it's possible to
    adjust capture filter on the fly)
  - tcp-flow, udp-flow: fix: apply settings on load (otherwise, initial settings
    are not respected)

  Ninja Scroll changelog:

  ! njs_log: critical fix: bin-text in cache-mgr could cause loss of index
    synchronization on a specific input (ultimately leading to a crash)
  - njs_log: critical fix: LineWidget::ensureVisible should prevent negative
    m_firstVisibleLine/Col (could cause repaint issues)
  - njs_log: fix: retro-colorize didn't properly repaint merged lines
  + njs_log: added sanity checks in retroColorize

  Jancy & Graco changelog:

  ! jnc_ct: explicitly disable address operator on 'threadlocal' variables
    (which is currently unsupported and leads to a crash)

................................................................................

version 3.14.3 (2020-07-10)

  Introduces: new TCP Flow and UDP Flow layers, support for app-sandbox,
  support for appstore receipts & winstore receipts, a critical bugfix in
  tdevmon for Windows, support for mixed DPI multi-monitors, support for recent
  kernels in tdevmon for Linux.

  Main application changelog:

  ! nj_app: check for winstore license
  ! nj_app: check app store receipt
  ! nj_app: show privacy settings once on the first run
  ! package: build sandboxed pkg for appstore
  ! package: build MSIX for winstore
  ! package/msi: produce two kinds of MSI packages (core and full)
  ! nj_app: use QWidget::fontMetrics for measuring char width
  + nj_log: added implementation for class log.ProxyWriter
  * nj_app: set privacy setting defaults to FALSE if inside app-sandbox
  - nj_app: fix: terminal ansi-white/ansi-black were not applied as standard
    text/back colors
  + nj_app: save security-scoped bookmarks wheh running in a sandbox
    otherwise, MRU lists and file-transmit wouldn't work after app restart
  * nj_app: use sandbox-compatible names for shared-memory and semaphores
  - nj_app: fix: clone shared sub-menus (apparently, it's not OK to add the
    same QMenu* to multiple menus; clone it to avoid QT warnings)
  - nj_app: fix: take care of negative delays in in QTimer::singleShot (set max
    delay to one day)
  * nj_cmn: put nj_VersionPp.h into build/include and add build/include to the
    include path

  Scripts changelog:

  ! udp-flow: separated udp flow mon into a pcap-based sniffer session and
    a pcap-sniffer/ethernet-tap compatible layer
  ! tcp-flow: separated tcp flow mon into a pcap-based sniffer session and
    a pcap-sniffer/ethernet-tap compatible layer
  ! common: fix: Sum16(LE/BE) and IP4 Checksums were incorrectly calculated when
    data block size is not 16-bit aligned
  + api: added class log.ProxyWriter
  * all: get rid of declarations w/o specifiers

  Device Monitor changelog:

  ! dm_lnx_lkm, dm_win_sys: critical bugfix: wildcard match routine didn't
    properly handled empty input string
  ! dm_lnx_lkm: compatibility fix: don't use struct timespec on linux > 4.20.0
  - dm_lnx_lkm, dm_win_sys: remove \r handling in wildcard match (this
    multi-wildcard functionality was never used)
  - dm_win_sys_core: minor fix: unnecessary to check for m_fileNameFilter in
    Connection_create

  Ninja Scroll changelog:

  ! njs_log: respect timestamp visibility when saving the log to a text file
  ! njs_wdg, njs_log: when calculating text size, take the target device into
    account

  Jancy & Graco changelog:

  ! jnc_ct: add support for external extension binaries
  ! jnc_rt: don't abort-throw unless it's safe (i.e. we are inside a "stable"
    call-site)
  ! jnc_io_usb: fix: check for error after calling axl::io::UsbDeviceList::
    enumerateDevices (otherwise, -1 is used as the element count)
  ! llk: major grammar update: removed declaration_wo_specifier
    (with exception for construct/destruct/set/etc)
  ! jnc_ct: grammar updates for the new graco
  ! graco: major update: error recovery
  ! graco: allow lookahead stmt to override the default lookahead, e.g.:
    lookahead(2, default)
  ! graco: major redesign: resolvers & lookahead are now specifiers of
    SymbolNode
  ! frame: use table-based indirect calls for all actions
  ! llk: opt: use thread-local pool for node allocation
  + jnc_ct: lexer should accept unterminated c-style comments
  + llk: added a comment explaining the trailer for qualified_type_name_rslv
  * all: get rid of function decls w/o specifiers
  * graco: accept unterminated c-style comments
  * graco: only use resolvers at the first step
  * graco: use anytoken for default production (if there was none)

  AXL changelog:

  ! axl_spy: new module for api interception via return-hijacking hooks (works
    without target function prototype information)
  ! axl_io: io::getTempDir should respect the TMPDIR environment variable
  ! axl_sl: fix: takeOver should be careful not to memcpy reusable tail-padding
  ! axl_sys_win: added wrappers for WinTrust and WinCrypt for Authenticode
    checks
  ! axl_cry: added app-store-receipt verification utilities
  ! axl_gui: text size calculations should take the target device into account
  * axl_sl: explicitly disable copy for sl::List
  + axl_cf: new classes: cf::Data, cf::Url, cf::SecScopedBookmark
  + axl_sys_win: added support for authenticode Rfc3161 timestamps
  + axl_iok: added function getComputerGuid (implementation by Apple)
  + axl_cry: added wrappers for PKCS7 (needed for app store receipt decoding)
  + axl_sys: added support for destructible objects in TlsPtrSlot
  + axl_sys: added API for simple TLS slot management (intptr_t values)
  + axl_enc: added enc::uleb128 and enc::sleb128 encodings
  + axl_sys_psx: new method: DynamicLib::getInfo
  + axl_dox: added support for custom command params in the \cmd{param} form

................................................................................

version 3.14.2 (2020-04-24)

  Service release

  Main application changelog:

  * nj_srv: added FileFlag_Unlink to the detail log record file
    otherwise, these files kept piling up in the ninja tmp-dir (POSIX only)
  - package: fix update download paths (didn't work for tagged versions)

  Scripts changelog:

  - tcp, ssl: fix: nullify m_localAddress before assigning m_addressFamily
    otherwise, the "auto-adapter" may reuse the previous local address
  * all-tcp: in onResolver event, shield connect() with 'try' (otherwise, we may
    have "unhandled-exception" records in the log)

  Jancy changelog:

  ! jnc_io: critical fix: set non-blocking mode for self-pipe on POSIX
    (otherwise, there is an opportunistic deadlock under high-load)
  ! jnc_io: fix: on macOS, io.SocketAddress.isEqual and .isMatch always returned
    false
  - jnc_io: fix: axl::io::SockAddr::isEqual/isMatch now accept (sockaddr const*)

  Ninja Scroll changelog:

  ! njs_log: major update: sticky-scroll now behaves more natural & predictable
  ! njs_log: fix: check for null-line before calling notifyRecordChanged
    (otherwise, opportunistic crash under high load)
  ! njs_log: fix: on rename, clear axl::io::FileFlag_Unlink -- otherwise, the
    newly saved log file gets deleted immediately (POSIX only)
  * njs_log: on clear, reset m_firstVisibleLine/m_firstVisibleCol

  AXL changelog:

  ! axl_io: on macOS, getExeFilePath should return realpath (otherwise, linked
    ioninja executables can't find conf files)
  * axl_io: remove unnecessary overloads io::SockAddr::isEqual/isMatch

................................................................................

version 3.14.1-a (2020-04-21)

  Service release (Linux and macOS only)

  Main application changelog:

  ! package: disable library validation for ioninja-server (otherwise, we can't
    'dlopen' 3rd party libraries from plugins; for example, J-Link RTT stopped
    working on macOS Catalina)

  AXL changelog:

  ! axl_glibc: added versioned symbols for clock_gettime & secure_getenv
    this effectively lowers GLIBC requirements from GLIBC-2.17 to GLIBC-2.9
  * cmake: when using glibc wraps, also link librt
  * axl_glibc: add explicit declaration for secure_getenv

  Jancy changelog:

  * jnc_io_base: don't rely on the system 'execvpe' (missing on macOS and GLIBC
    version < 2.11)

................................................................................

version 3.14.1 (2020-04-14)

  Service release

  Main application changelog:

  ! nj_app: critical fix: standard (over-email) evaluation licenses stopped
    working due to broken extraction of product key
  - nj_app: on certain platforms, welcome-dlg layout looked distorded due to
    QGroupBox stylesheet conflicts
  * nj_app: welcome-dlg should initially set focus to the "I want to evaluate
    IO Ninja" radio button
  + package: added ioninja.desktop and png icons to all Linux packages
  - package: fix: only include top-level directory for zip & tar
  - nj_app: fix: use QByteArray.constData to avoid cast ambiguity on older QTs

................................................................................

version 3.14.0 (2020-04-10)

  Introduces: TCP Listener, SSL Listener & Pipe Listener are now "real" servers
  with support for multiple clients, TCP Proxy supports multiple proxy
  connections, TCP Flow Monitor follows multiple connections, the Mac OSX build
  is now notarized with Apple and doesn't cause Gatekeeper warnings, first-time
  evaluation doesn't require email.

  Main application changelog:

  ! nj_app: support "smooth" first-time evaluation without an email form
  ! nj_app: added support for unicode arguments on windows (e.g., when
    double-clicking a unicode log file name)
  ! package: Mac TAR & DMG packages are now signed and notarized to keep the Mac
    Gatekeeper happy
  ! package: packages for Mac now include libcrypto & libssl and don't refer to
    the system OpenSSL dylibs (boobie-trapped on Catalina)
  - nj_app: fix: save installation-guid as string -- otherwise, it gets lost
    upon restart on Mac (seems like a QT bug on Mac)
  + nj_app: over-email evaluation & serial number forms offer the newlsetter
    opt-in option
  + package: Mac DMG now has a nice background
  * conf: moved TCP back to the top (people now confuse TCP-vs-SSL)
  * nj_ui: don't try to be smart and always fire onCurrentData and
    onCurrentTextChanged (not when they really change)
  + nj_log: added property log.Log.m_syncId (for synchrnoizing async completion
    records) e.g.: "connecting to abc.com...ok"
  - nj_doc: removed Plugin::transmitTo (never used)
  - nj_srv: fix: preserve layer-creation error (deleting jnc::Module and
    jnc::Runtime may overwrite error)
  * nj_ui_srv: redesign onchange properties for ui.ComboBox
  * conf: moved SslLog.njlog to a dedicated folder
  - package: added io_ssl.jncx to the MSI package (SSL plugins didn't work)

  Scripts changelog:

  ! pipe-listener: major update: support multiple clients & view filter
  ! tcp-listener: major update: support multiple clients & view filter
  ! ssl-listener: major update: support multiple clients & view filter
  ! tcp-proxy: major update: support multiple clients & view filter
  ! tcp-proxy: send-and-close is not losing data now
  ! tcp-flow-mon: major update: support multiple connections & view filter
  ! udp-flow-mon: added view filter
  - log: fix: log.MonitorLog should convert wildcard to lowercase
  * tcp-server, ssl-server, pipe-server: rename: XxxListener -> XxxServer
  - file: fix: update m_isTransmitEnabled according to buffer state of the
    stream (not just m_state)
  + file-log: added a new record code Opened which also shows openFlags
  * pcap-sniffer: use the new io.Pcap API (openDevice/activate)
  - pcap: fix: don't add filter-changed records if filter didnt really change
  - pcap-sniffer: fix: launch code into IP4 defragmentation should take the
    pcap link type into account
  - common: fix: ui.BufferPropertySet should use m_defaultXxx and not
    Defaults.Xxx
  * common: extract common IP decoding and defragmenting functionality from
    UdpFlowMon & TcpFlowMon into io.IpDecoder
  + pcap-log: added PcapLogRecordCode.SetCaptureFilter, SetAddressFilter
  * i2c-spi: rename I2cSpiSniffer -> I2cSpiTap
  * common: moved: io.Monitor, io.FpgaUploader -> iox.Monitor, iox.FpgaUploader
  * udp, tcp-proxy: use iox.HostNameResolver
  + common: added iox.HostNameResolver (encapsulates sync & logging)
  - misc: stylisitic fix: use . instead of ->
  - ui: ui.ComboBox.m_onChanged is removed (use bindable events of specific
    properties: m_editText, m_currentText, m_currentIndex)
  + socket-log: added new records: ClientRemoved, ResolveCompletedPrefix,
    ResolveCompletedPrefix, DisconnectDataPending
  + ui: property ui.ComboBox.m_currentData must be non-const
  + log: added syncId for synchronizing multi-part records (e.g.
    connecting to abc.com...ok)
  - doc: removed doc.Plugin.transmitTo & doc.Layer.transmitToNext (never used)
  + socket-log: added class SocketClientLogFilter
  + socket-log: added new record code: ClientChanged
  + api: added methods: ui.ComboBox.addItemSetCurrent, insertItemSetCurrent

  Jancy changelog:

  ! jnc_ct: critical fix: onevent statements were dysfunctional after the
    introduction of lazy-compilation
  ! jnc_rt: critical fix: Runtime::initializeCallSite should check if m_map is
    NULL before accessing it
  + jnc_app: add build rpath to OPENSSL_DLL_DIR (otherwise, SSL tests may fail
    if io_ssl is built against non-system OpenSSL so-s/dylib-s)
  + jnc_ext: optionally sign dylib-s inside jncx on mac
  - jnc_ct: fix: dual types were not properly finalized on the implicit-this
    member operator
  + jnc_io_base: added const property m_osHandle to file- and socket-based
    classes
  * jnc_std: strtol/strtoul: set default radix to 0 (means, auto-detect)
  + jnc_io_base: added flag mappings: FileOpenFlag.Unlink, Clear, Asynchronous,
    WriteAttributes
  - jnc_io_base: typo fix: implementation of getFileKind for windows didn't
    detect serial ports or pipes
  * jnc_io_pcap: refactor API: Pcap.openDevice -> openLive
  + jnc_io_pcap: added Pcap.openDevice and Pcap.activate
  * jnc_io: replace suspendIoThread(false) -> unsuspendIoThread()
  + jnc_io_pcap: added property m_kernelBufferSize
  * jnc_io_pcap: made property m_snapshotSize non-read-only
  * jnc_io_pcap: set default snapshot size to 64K
  - jnc_api: fix: jnc_Variant_hash didnt work for references
  + jnc_api: implemented operators == and != for variants of the same type (via
    memcmp)
  - jnc_ct: fix: err::setError returns size_t, not err::Error
  - jnc_ct: fix: set m_parentUnit for onevent handlers
  * jnc_std: std.Bufer.clear must be implemented in jancy (this way, it can be
    inlined)
  * jnc_io_base: io.SocketAddress.isMatch/isEqual should be const

  Ninja Scroll changelog:

  + nj_log: keep the size of last record in the record file header -- this
    way we can calc the offset of the last record

  AXL changelog:

  - axl_sl: fixed parsing the solidified command line string (support escapes on
    posix, escaped-quote-only on windows)
  + axl_enc: handle unterminated escapes in esc::EscapeEncoding
  + axl_sl: added class EqBin (for using binary-structs as HashTable keys)
  + axl_io: added method NetworkAdapterDesc::isNullMacAddress
  + axl_io: added FileFlag_WriteAttributes (windows-only).
  + axl_io_pcap: added methods: Pcap::setPromiscious, setTimetout, openLive,
    openDevice, activate, setSnapshotSize, setBufferSize
  + axl_io_psx: implemented mac retrieval on mac & linux via AF_LINK, AF_PACKET
    and SIOCGIFHWADDR

................................................................................

version 3.12.2 (2020-03-12)

  Introduces: new "SSL Connection" plugin for establishing raw SSL connections,
  new "SSL Listener" plugin for accepting raw SSL connection, new "Process"
  plugin for running child processes, list of MRU plugins, a couple of critical
  bugfixes in Jancy.

  Main application changelog:

  ! nj_app: added a list of MRU plugins to the new-session/new-layer drop-downs
  ! nj_app: use two-level new-session drop down (two many plugins by now to keep
    everything in a planar list)
  * nj_ui: removed BaseTailPadding and assert proper alignment of base classes
  * conf: moved ssl plugins to the top
  - nj_app: don't serialize propertySplitterPos (doesn't work well when
    different plugins are used); now we explicitly call resize
    ui.PropertyGrid.resizeNameColumnToContents
  + nj_ui: added implementation for ui.PropertyGrid.resizeNameColumnToContents
  + nj_ui: implemented property: BoolProperty.m_isGroupEnabler
  + nj_ui_srv: added autoget field: Property.m_parent
  + nj_ui: implement properties: ui.FileProperty.m_mode, m_options
  * nj_ui_app: combo boxes should use EditRole for selecting appropriate item in
    the drop down
  * nj_app: added size-grips to appropriate dialogs
  + nj_ui_srv, nj_ui_app: added new UI class: DictionaryProperty
  - nj_ui: removed getVariantString (now, part of libjancy)
  * nj_app: create property managers lazily (previously, all property managers
    were created regardless of whether they are used or not)
  * nj_app: on play-log-in-terminal, force-show terminal
  - nj_ui: on win-x86, get rid of dependency on
    kernel32.dll:InterlockedCompareExchange64 (missing on windows xp)
  * nj_app, nj_srv, nj_log: PlayInLogProcessor is now a range processor (more
    efficient)
  + nj_app: serialize and add recently used plugins to the menu
  * conf: rearrange plugin lists
  - nj_app: fix: workaround for swapping Ctrl & Meta on MacOS in the terminal
  * nj_app: call TerminalFrame::raise when showing terminal (::activate is not
    enough on MacOS)
  + nj_ui: added method: ui.Terminal.write
  + conf: added plugins: ssl, ssl-listener, process
  + nj_srv: add ssl error provider
  * nj_srv: link to axl_io_usb

  Scripts changelog:

  ! ssl: added the "SSL Connection" plugin
  ! ssl-listener: added the "SSL Listener" plugin
  ! process: added the "Process" plugin
  ! net-plugins: use the new class io.HostNameResolver instead of the removed
    io.SocketAddressResolver
  ! api: added property ui.BoolProperty.m_isGroupEnabler (a common pattern where
    a checkbox enables/disables all children)
  - pipe: fix: disable transmit on disconnect
  - tcp-listener: fix: disable transmit on disconnect
  - ssl-listener: fix: disable transmit on disconnect
  - transmit: fix: transmit script arp-whois.jnc used removed enum
    io.ArpProtocolType
  * net-plugins: use the new features of SocketPropertySet/SshPropertySet
  * serial: use the newly added ui.BoolProperty.m_isGroupEnabler
  * all-plugins: call PropertyGrid.resizeNameColumnToContents()
  * common: redesign of SocketPropertySet & SshPropertySet
  + api: added method: PropertyGrid.resizeNameColumnToContents
  * api: a minor cleanup of property builder methods
  + api: added properties: ui.FileProperty.m_mode, m_options (so we can use it
    for directories, too)
  + api: added readonly property ui.Property.m_parent
  * tcp-listener, tcp-proxy: use newly added
    ui.SocketPropertySet.m_overrideConnectionProp
  * pipe: rename m_overrideOldConnectionProp -> m_overrideConnectionProp for
    consistency
  + common: added new property m_overrideConnectionProp to SocketPropertySet
  * common: DefaultRemoteAddress should be const
  + api: added new class: ui.DictionaryProperty
  * api: rename: FileProperty.m_fileDialogCaption -> m_fileDialogTitle
  * ssh-serialmon: adjust text in errors: "machine interface" -> "tdevmon MI"
  * ssh-serialmon: improved handling of MI errors (most  importantly, handle
    the situation of missing tdevmon)
  - ssh: fix: SshLogRecordCode.SshAuthenticating was not represented
  + api: add method: ui.Terminal.write
  - tcp-listener: fix: after rejecting a client, no moдаre incoming connections
    were accepted
  * all: make use of the new common field m_port in the
    io.SocketAddress (shared between ip4 and ip6)
  * all: stylistic change: remove space before partial application operator
    ~(...)

  Jancy changelog:

  ! jnc_io_pcap: fix: crash on windows if wpcap.dll cannot be delay-loaded
  ! jnc_io_ssl: new extension library for client/server SSL sockets
  ! jnc_io_base: new class HostNameResolver to replace SocketAddressResolver
  ! jnc_io_base: new class io.ChildProcess for running child processes
  ! jnc_ct: critical bugfix: catch & finally labels didn't actually finalize
    current scope (closeScope was called from unreachable block)
  ! jnc_ct: preserve values across async-returns
  ! jnc_io: added method to all IO classes: asyncWait
  ! jnc_api, jnc_rtl: made Promise completion available via API (so that it's
    possible to implement async interfaces in extension libs)
  ! jnc_io_base: critical bugfix: don't gc-alloc under lock (previously, i used
    NoCollectRegion, but it's not enough -- we still may deadlock when entering
    the call-site)
  - jnc_api: removed BaseTailPadding (bad practice); replaced with an ASSERT
  * jnc_api: mark the union inside jnc::Variant as requiring 8-byte alignment
  * jnc_ct: if jncDynamicExtensionLibMain returns NULL, it probably sets some
    error -- don't overwrite it with a generic message
  - jnc_io_ssh: fix: openssl is required for jnc_io_ssh; check for its presence
    before adding jnc_io_ssh
  - jnc_std: crtical bugfix: move m_mapEntry from MapEntry to StdMapEntry (fixes
    tail-padding issues on x86)
  - jnc_std: fixed calling-convention mismatch in RbTree::removeImpl on x86
    (thiscall vs cdecl)
  * jnc_rtl, jnc_api: export jnc_Variant_format_v (formerly, only available as
    formatting literal routine in rtl-core)
  + jnc_api, jnc_std: provide direct access to std.HashTable & std.RbTree
  * jnc_io_ssh: read stderr if PTY wasn't requested
  + io_devmon: added enum member: DeviceMonitorMiMsgCode._Last
  - jnc_ct: fix: close dynamic lib zip readers after parsing is complete
  + jnc_api: added API func: jnc_createPromise
  - jnc_ct: fix: use llvm::TerminatorInst for all LLVMs prior to llvm-8.0
  - jnc_ct: fix: BasicBlock::iterator syntax workaround
  - jnc_ct: fix: preserveNames template argument for class IRBuilder<> was
    removed in llvm-3.9.0
  * jnc_dll: use xcode.cpp instead of xcode.c
  * jnc_api: don't map type methods if type namespace is not ready (means, it's
    unused - don't lazy parse it during mapping)
  + jnc_api: added jnc_Namespace_isReady, jnc_Module_getStdType
  * all: rename axl::err::ErrorMgr::setForwardRouter -> setRouter; remove extra
    error providers from jnc_api (should be done in the main app only)
  * jnc_io_ssh: process FD_CLOSE
  + jnc_std: std.Buffer: added overloads for 'char'
  * std.Buffer.detach() should return char*
  * jnc_io_cmn: make m_port directly accessible in union io.SocketAddress
  * jnc_io_cmn: extracted a common base from AsyncIoDevice (AsyncIoBase) for the
    cases where read/write buffering is not needed
  - jnc_io: fix: minor fix in SocketBase::acceptLoop on Windows
  * jnc_io: moved accept loop to SocketBase
  * jnc_io: renamed tcpConnect -> connectLoop
  + jnc_io: added implementation for getFileKind on POSIX (via fstat)
  * jnc_io: moved FileKind detection to io_File.jnc
  * jnc_io: io.File.m_kind and io.FileStream.m_kind are now properties
  - jnc_io: fix: memory leak on IO error (windows-only, overlapped struct was
    not returned to the overlapped pool on error)
  + jnc_io: added a default timeout value of -1 to blockingWait

  Ninja Scroll changelog:

  ! njs_log: critical typo fix: invalid indexing into the target buffer in
    BufferingRecordWriter (leads to crash with 2 or more converters)
  ! njs_log: critical fix: reset m_lastRecordOffset and m_lastRecordIdx on clear
  * njs_log: fix assert: CacheLineFlag_MergedForward may be missing if lines are
    in different pages (i.e., last line & first line in two adjacent pages)
  + njs_log: added support for trailing tabs (to continue tables)
  - njs_log: fix assert: CacheLineFlag_MergedForward may be missing if lines are
    in different pages (i.e., last line & first line in two adjacent pages)
  - njs_wdg: fix: ensureVisible() was overly aggressive with scrolling
  - njs_log: fix: missing GetLogPosKind_SelectionStart flag when
    getting LogPos for the beginning of range
  * njs_wdg: if scroll is inevitable, ensureVisible() should try to
    put it in the center

  QT Property Browser changelog:

  ! qtpb: added new type of property: QtDictionaryPropertyManager
  ! qtpb: added prop isGroupEnabler for bool properties (makes all
    children enabled/disabled according to the bool property state)
  ! qtpb: combo properties should use EditRole for selecting items
    in the drop-down
  - qtpb: removed default values for QtFilePropertyData (empty
    strings work best)
  * qtpb: show tooltips for items in the drop-downs for combo properties
  - qtpb: removed setValueStatusTip declaration (unused and unimplemented)

  AXL changelog:

  ! axl_io_ssl: added wrappers for the SSL submodule of OpenSSL
  ! axl_io: added class axl::io::psx::Pty
  ! axl_core: added time64 functions from https://github.com/evalEmpire/y2038
  - axl_sl: typo fix: (isAligned should return bool)
  * axl_cry: openssl error should use the hexadecimal notation for the
    error code
  + axl_cry: added class: cry::Dh
  + axl_cry: added methods: cry::Rsa::create, generate
  + axl_cry: added methods cry::BigNum::getWord/setWord
  + axl_sl: added methods: sl::String::setSubString, setLeftSubString,
    setRightSubString
  * axl_io: micro: moved zeroing of wait-count under if (...)
  - cmake: removed the unnecessary " " option in GCC_FLAG_DEBUG_INFO_RELEASE
  + cmake: add -Wno-char-subscripts as default for Xcode gen
  - axl_gui_qt: fix: handle empty QKeyEvent::text in QtWidgetBase::keyEventImpl
  - axl_io_psx: fix: declare 'code' arg to ioctl and fcntl as unsigned to
    prevent signed expansion on platforms where it's declared as long
  * axl_zip: on windows, append "N" to the mode string (makes the resulting
    handle non-inheritable)
  * axl_err: ErrorMgr should use public inheritance from ErrorRouter
  + axl_err: added routing for error descriptions
  + axl_cry: added wrappers for PEM & DER serialization for X509 certs
  * axl_cry: conditionally use BIO_METHOD* or const BIO_METHOD* depending on the
    OpenSSL version
  + axl_io: added method axl::io::win::File::getType (maps to GetFileType)
  * axl_sys: rename Process::createProcess -> Process::create
  - axl_sys: axl::sys::psx::getProcessImageName should use type pid_t
  * axl_sys, axl_io: moved things around: removed _win/_psx/_drw/_lnx folders;
    instead, added _io_pcap/_io_usb/_io_ssl

................................................................................

version 3.12.1 (2019-12-27)

  Service release: fix for a crash on select-word on an empty line, fix for a
  lock-down on unplugging Ethernet Tap or I2C/SPI Tap during capture, fix for
  non-selectable merge-boundary in text lines.

  Scripts changelog:

  ! ethernet-tap, i2c-spi-tap: fix: graceful stop waits forever on IO error

  Ninja Scroll engine changelog:

  ! njs_log: fix: adjust initial offset in selectWord() -- could have caused a
    crash if selectWord was called beyond the end-of-line
  ! njs_log: reset CacheTextLine::m_fullLength on merge (caused merge boundaries
    in text lines to be non-selectable)
  * njs_log: assert for proper usage (p < end) in findWordBoundary

  Jancy changelog:

  - jnc_io_usb: fix: incorrect assert in UsbInterface::removeEndpoint
  * jnc_io_usb: UsbEndpoint::write shouldn't clear
    UsbEndpointEvent_WriteCompleted if error was detected
  * jnc_io_usb: set UsbEndpointEvent_WriteCompleted in
    UsbEndpoint::cancelAllActiveTransfers

................................................................................

version 3.12.0 (2019-12-20)

  Introduces: new Ethernet Tap hardware sniffer & plugin, detail pane for the
  master-log-vs-details representation, added support for multiple protocols and
  post-capture filtering in the Pcap-based sniffer, process name detection in
  Serial, Pipe & Mailslot monitors, post-capture filters for file name, file id,
  process name and PID in Pipe & Mailslot monitors, introspection facilities
  and lazy parsing in Jancy.

  Main application changelog:

  ! nj_app, nj_srv: major update: added detail pane (crucial for Ethernet Tap,
    Pcap Sniffer and, in the future, other plugins)
  ! nj_app: added support for deep-find in FindDlg
  ! nj_app: changed the keep-alive timestamp logic (fixed the bouncing app icon
    issue on mac osx when ioninja is in the background)
  ! nj_srv, nj_ui_srv: added class ui.InformationStatValue to support delayed
    stats UI updates -- now plugins can efficiently calculate stats without
    worrying about UI updates gobbling up the CPU
  ! nj_app, nj_srv, nj_cmn: redesign of plugin load facilities (unification of
    methods used in nj_app and nj_srv)
  ! drivers: new packages with new sniffer VID/PIDs for win7 & win10
  + nj_log: added new class LogDetailizer (to be called from the deep-search
    and other range-processors)
  + nj_srv: export global function: sendKeepAlive (for simple non-async loops
    in the main thread)
  + nj_log: added method Log.rebuild()
  + nj_log: add const property log.Log.m_recordFileName (maps to
    njs::Server::getOriginalRecordFileName)
  + nj_log: added a scatter-gather overload for log.Writer.write
  + nj_ui: added support for placeholder text to ui.ComboBox, ui.StringProperty,
    ui.ComboProperty
  + nj_ui_app: added support for ColorFlag.Transparent in
    ComboBox.m_backgroundColor
  - nj_app: fix: parse and load log filter settings
  - nj_srv: typo fix: processMsg_Load should call loadRecordCodeFilterProperties
  - nj_log: fix: mark wait regions (due to njs::Server::suspend())
  - nj_log: fix: RecordCodeFilterGroup::m_isVisible was not initialized
    (should be true by default)
  - nj_app: fix: don't add duplicate plugins to the cmdline
  - nj_etx: fix: require 'main' function
  * nj_doc, nj_etx: moved 'transmit' to a dedicated library TransmitLib; link it
    to script-transmit modules
  * nj_app: rename single-user -> personal
  * nj_ui_app: FileDlg should reuse the last directory
  * nj_app: increase process wait time to 5 sec (the same as keep-alive-timeout)
  * nj_app: document should initially set focus to the master log
  * conf: added scripts/protocols to the standard import path
  * nj_app: serialize default plugin log filter settings
  * njs_srv: update status after a log is open (otherwise, hanging in a plugin
    constructor looks like we are trying to open a log)

  Scripts changelog:

  ! ethernet-tap: a new plugin for the hardware Ethernet Tap sniffer
  ! pipemon, mailslotmon: major update: added view filter (file name, file id,
    process name, PID)
  ! pcap-sniffer: added view filter (applicable post-capture)
  ! net-sniffer-log: added support for app-level protocols (e.g. DNS, NBNS,
    LLMR, DHCP, etc)
  ! common: added log_RepresentStruct.jnc (generic representation of an
    arbitrary structure using the Jancy introspection facilities)
  ! api: added class ui.InformationStatValue (delayed UI updates for efficient
    stats calculations)
  ! api: added placeholder text properties to ui.ComboBox, ui.StringPropterty,
    ui.ComboProperty (and all property-creating methods)
  + api: added method log.Log.rebuild
  + mailslotmon: also show writes (otherwise, we don't see any data on client
    files)
  + replay-log: added support for replaying custom log record codes
  + modbus: added request/reply/error stats
  + packets: added Modbus TCP frames to the Modbus library
  + serialmon: added SerialMonLogRecordCode.DeviceOpenError
  + serialmon:added process name information to DeviceOpened/DeviceOpenError
  + common: added utils for representation of new device opened/device open
    error records (with process names)
  + common: added class log.MonitorFilter capable of filtering by file name,
    process name, file id, process id
  + common: added function wildcardCompareStringLowerCase (Krauss algo)
  + pcap-sniffer: added export to pcap
  + common: added utilities for exporting *.njlog logs to *.pcap files
  + common: added property io.Monitor.m_logWriter
  + plugins: use the new placeholder texts int all editable combos, string and
    combo properties
  + api: added new methods: sendKeepAlive, log.Log.m_recordFileName,
    ui.ProgressDlg.dispose
  + api: added LineAttrFlags.Preview
  + fpga-uploader-log: added FpgaUploaderLogRecordCode.FirmwareBootFailed
  - ethernet-tap: removed show-raw-data prop
  - udp: removed the auto-switch-remote button from the toolbar
  - api: removed an unnecessary overload for Log.addConverter
  - all: remove the alignment directive from the bottom of files (unnecessary --
    Jancy parser resets alignment to default for each compilation unit)
  - common: removed io.Monitor.m_fileIdMgr (we will use FILE_OBJECT as ids)
  - mailslot-mon: fix: MailslogMonitor should call m_session.m_logWriter (it
    doesn't  have a direct logWriter)
  - mailslot-mon: fixed immediate throughput/size info
  - pcap-sniffer: removed throughput-calc (isn't implemented now, anyway)
  * moved NetSnifferLog to a shared log plugin (will be shared between
    pcap-sniffer and etherner-tap)
  * udp: change the back color of remote combo when it's on (and show a tooltip
    with a description)
  * api: minor cleanup of addConverter API
  * pcap-sniffer: open pcap is moved to the toolbar
  * net-sniffer-log: use the newly added table-feature in ninja-scroll
  * api: updated color for PasteOrange
  * common: minor update in checksum calc format specifiers
  * tcp-flow-mon, udp-flow-mon: updated PcapLogRecordCode names (Filter ->
    CaptureFilter)
  * pcap-log: renamed ...Filter... -> ...CaptureFilter... (now  that we have
    both capture filters and view filters)
  * i2c-spi-tap: use 0x1000 as upload-base-index (new io.FpgaUploader API)
  * common: updated declarations for the TCP/IP stack
  * common: io.FpgaUploader should check for RpdVersion post-upload
  * common: added a setting to io.FpgaUploader for configuring baseIndex
    (e.g. 0x1000 for I2C/SPI Tap, 0x2000 for EthernetTap)

  Ninja Scroll engine changelog:

  ! njs_log: added support for tables (\t chars in text parts automatically
    align columns and form nicely-looking tables)
  ! njs_log: added support for bin-preview (show a limited number of lines from
    the bin-block)
  ! njs_log: fixed saved-log-as-text in plain-text mode
  ! njs_log: fixed selectWord for Unicode text strings and binary blocks
  ! njs_log: added new type of plugins: Detailizer (used for deep-search and,
    in the future, other range processors)
  ! njs_log: major update: range processors now can use the detail-pane
  ! njs_log: fix: prevent multiple simultaneous fold record requests for the
    same line
  ! njs_log: added support for scatter-gather log record writing
  + njs_log: added public methods: Server::getOriginalLogFileName(),
    getFinalLogFileName()
  + njs_log: added Server::isOpen
  + njs_log: added new protocol messages: RangeProcessCompleted,
    SetDetailSelection, SetDetailHilite, SelectRecord, HiliteRecord,
    KillSelection, KillHilite
  + njs_log: added FoldFlag_ExpandAll (all except for FoldFlag_Hidden)
  + njs_wdg: added methods: isHiliteEmpty, getHiliteStart, getHiliteEnd
  + njs_log: added method: waitIndexReady
  + njs_wdg: added parameter: const gui::TextAttr& selAttr to paint functions
  + njs_log: added methods: selectRecord(uint64_t recordIdx),
    hiliteRecord(uint64_t recordIdx)
  + njs_log: added method: forceUpdateUi()
  + njs_log: added flag m_isStickyScrollEnabled (to force-disable sticky scroll
    when not needed)
  + njs_log: added ConstFoldingFilter (e.g. for auto-expand)
  + njs_log: added NotifyCode_RecordChanged
  + njs_log: add RecordFile::getClassGuidArray (including the main one)
  + njs_log: add a delimiter on PartKind_Break
  - njs_log: fix: nullify m_clientPeer in Server::close()
  - njs_log: fix: openConvertedRecordFile did not preserve the original class
    GUID array
  - njs_log: remove space before array parentheses in CopyBinProcessor
  * njs_log: better checks on existing record file sizes, handle class guid
    duplicates properly
  * njs_wdg: set hex-ascii gap to 2 characters
  * njs_log: selects bin range improvements

  Device Monitor changelog:

  ! dm_lnx_lkm: use write_cr0 from Linux 5.2 (the previous release of tdevmon
    v3.3.3 stopped working on Linux >= v5.3)

  QT Property Browser changelog:

  ! qtpb: added support for placeholder texts in string & combo properties

  Jancy changelog:

  ! jnc_rtl_intro: added introspection facilities (the ability to inspect the
    program structure at runtime)
  ! jnc_ct: major redesign: lazy parsing (skip whole bodies of unused namespaces
    without tokenization)
  ! jnc_ct: cricital bugfix: internalPrologue didn't take struct-ret into
    account when extracting the arg-array
  ! jnc_rt: criticial fix: invalidate destructed class boxes and do not add
    invalidated boxes to the mark queue (caused problems when C++ destructor
    optimized some clean-up code away)
  ! jnc_io_usb: fix: recursively release interfaces and close endpoints (caused
    lock-downs when unplugging Taps during capture)
  ! jnc_ct: fix: specially handle null values in vararg lists (caused a crash)
  ! jnc_io_pcap: use signals and pcap_breakloop on close (otherwise, it's
    impossible to stop a capture if no packets arrive)
  ! jnc_io_base, jnc_io_cmn: fix: proper support for zero-sized reads/writes
    (important for UDP, here we can send empty datagrams)
  ! jnc_ct: major redesign: make overloaded functions explicit via
    class FunctionOverload and union OverloadableFunction
  ! jnc_ct: major redesign: get rid of dry-operators (getXxxResultType)
  ! jnc_ct, jnc_api: major redesign: removed LazyModuleItem, added LazyImport
  ! jnc_rt: critical fix: GcHeap::markClassFields should also mark class fields
    in base classes
  + jnc_ct: added support for simple format specifiers in formatting literals,
    e.g. $"value: %02x"(n) instead of $"value: %(1; 02x)"(n)
  + jnc_io_pcap: added io.PcapFilter for offline filtering
  + jnc_io_pcap: added support for npcap on windows; use npcap when available
  + jnc_io_pcap: added env setting JNC_IO_PCAP_DISABLE_NPCAP for disabling npcap
  + jnc_sys: added function: sys.getProcessImageName
  + jnc_sys: added function: sys.getCurrentProcessId
  + jnc_std: added methods: std.StringBuilder.chop, trim, trimLeft, trimRight
  + jnc_std: added std.StringBuilder method overloads for
    (utf32_t c, size_t count) so it's possible to multiply characters
  + pygments: added async/await keywords
  + jnc_ct: added method EnumType::findConst(int64_t value)
  + jnc_ct: allow attributes for enum constants
  + jnc_app: added a new cmdline switch -x/--exclude (to exclude specific files
    from directories; useful when we use -S to mass-add source files)
  + jnc_ct: on ARM, map memcpy/memmove/memset
  + jnc_ct: added method Namespace::ensureNamespaceReadyDeep
  + jnc_rt: add Variant::create (possibly, via GC-allocation)
  + jnc_rt: add GcHeap::markClassPtr/markDataPtr
  + jnc_api: add createForeignStringPtr overload for axl::sl::StringRef
  + jnc_api: add TypeKind to the parameter list for getXxxPtrType(...)
  + tools: added file2literal.pl (will eventually replace jnc2cpp.pl)
  - pygments: remove 'preconstruct' from token list in JancyLexer
  - jnc_ct: don't add the 'static' attribute to global functions & variables
    when generating documentation
  - jnc_ct: don't create doxy tokens when not needed (which is almost never)
  - jnc_ct: fix: GlobalNamespace::generateDocumentation should bail if
    generateMemberDocumentation fails
  - jnc_ct: typo fix in StructType::layoutField (should bail on fail)
  - jnc_ct: typo fix in BitFieldType::prepareDoxyLinkedText
  - jnc_ct: Typedef doesn't need calcLayout
  - jnc_ct: fix: CdeclCallConv_arm didn't lay out coerce array types
  - jnc_ct: fix: fat pointer pointer closure check in direct thunk
  - jnc_std: fix: std.Buffer should properly handle null-strings in append() and
  - jnc_ct: fix: use 'unsigned char' when calculating character literals values
  - jnc_ct: fix: m_requireSet should be cleared in Module::clear()
  - jnc_rt: fix: invalidated class objects should still be weak-marked
  - jnc_io_pcap: fix: sigemptyset may be a macro (remove context operator ::)
  - jnc_io_pcap: fix: cast uint64_t to pthread_t before passing it to
    pthread_kill
  - jnc_ct: fix: Namespace::clear should also clear the orphan array
  - jnc_io_pcap: fix: only include jnc_io_PcapSignalMgr.h on POSIX
  - jnc_ct: fix: zero dst memory on array casts
  - jnc_ct: removed Parser::Flag_ConstExpression (checking on each identifier is
    neither efficient nor enough); better check the final expression result
    where it matters
  - jnc_rt: fix: moved assert on TLS list empty *after* finalizing destruct
    thread
  - jnc_api: fix: indirect variant didn't save the newly allocated data ptr
  - jnc_rt: fix: GcHeap::collect_l should signal m_destructEvent if
    m_dynamicDestructArray is not empty
  - jnc_rt: fix: jnc_createForeignStringPtr should not use length + 1 for null
    pointers
  - jnc_api: fix: callFunctionPtr overload for a single arg had an extra RetVal*
    parameter
  - jnc_ct: disallow casts of const arrays into non-const pointers
  - jnc_ct: fix: set correct parent unit/namespace when parsing attribute values
  - jnc_ct: fix: restore previous unit after parsing lazy imports
  - jnc_std: fix: ensure zero-termination in std.StringBuilder
  - jnc_ct: fix: export ___bzero on macOS (required by LLVM)
  - jnc_ct: fix: thin function pointers do need calc-layout
  - jnc_ct: fix: don't use non-ANSI ltoa/ultoa/lltoa/ulltoa
  - jnc_ct: fix: offsetof operator needs a special handling when getting a value
  - jnc_api: fix: JNC_MAP_PROPERTY didn't check for NULL (missing property)
  - jnc_std: fix: added const modifiers to const methods in std.Array
  * jnc_std, jnc_rtl: moved resetDynamicLayout to the 'jnc' namespace
  * jnc_ct: don't calc layout on documentation generation; instead do a
    dedicated step 'ensureNoImports'
  * jnc_ct: handle doxy-comments as pragma productions
  * jnc_ct: Namespace::resolveOrphans should call getModuleItem outside of the
    main loop
  * jnc_ct: use StdType_CharConstPtr (instead of non-const ptr) in
    OperatorMgr::memCpy and Parser::appendFmtLiteralRawData
  * jnc_ct: getConditionalOperatorResultType should prefer const-ptr
  * jnc_ct: getConditionalOperatorResultType should add PtrTypeFlag_Const to
    pointers derivative from const-arrays
  * jnc_io_devmon: replaced int32_t m_ntStatus with a union (otherwise,
    m_ntStatus sounds weird on POSIX)
  * jnc_ct: setCastError should show if an operand is constant
  * jnc_ct: moved ';' to statement (otherwise, empty-body loops won't compile)
  * jnc_io_pcap: inversed the order of linkType, snapshotSize (should be the
    same as in pcap_open_dead)
  * jnc_io_pcap: set default arg value: filter = null
  * jnc_rt, jnc_ext: rename: ScopedNoCollectRegion -> NoCollectRegion
  * jnc_io_pcap: rename: PcapLinkType.Null -> Loopback
  * jnc_ct: use table-based lookups for ModuleItem::getDecl,
    ModuleItem::getNamespace, ModuleItem::getType
  * jnc_ct: moved attribute_block from declaration_specifier to
    common_declaration
  * jnc_sys, jnc_std: use file2literal.pl instead of jnc2cpp.pl
  * jnc_ct: parse attribute initializers for named types and fields
  * jnc_rt: make debug traces for destructible classes optional (off by default)
  * jnc_ct: rename baseTypePrimeArray -> classBaseTypeArray
  * jnc_ct: rename Property::isReadOnly -> isConst
  * jnc_ct: move JNC_MAP_STD_FUNCTION, JNC_MAP_STD_PROPERTY to
    jnc_ct_StdFunction.h, move JNC_MAP_STD_TYPE to jnc_ct_StdType.h
  * jnc_ct: opt: return sl::Arrays by reference
  * jnc_rt: opt: GcHeap::collect_l should use StdType_AbstractClassPtr instead
    of precise class pointer
  * jnc_ct: replace DerivableType::getCastOperator -> getCastOperatorArray

  AXL changelog:

  + axl_io: added io::PcapFilter for offline filtering
  + axl_io: added function: io::matchWildcard (Krauss algorithm)
  + axl_lex: added an extra functor argument to getTokenListString for
    customizing spacing rules
  + axl_fsm: added implementation for Regex::match
  + axl_sys: added function: getCurrentProcessId()
  + axl_sys: added function: getProcessImageName()
  + axl_err: added functions: getLastSystemError(),
    getLastSystemErrorDescription()
  + axl_cmake: added setting: GCC_FLAG_DEBUG_INFO_RELEASE for adding
    debug info to release builds
  + axl_sl: added sl::ListLink g_nullListLink
  + axl_io_pcap: added methods Pcap::getSelectableFd(), loop(), breakLoop(),
    getBlockingMode(), dispatch()
  + axl_mem: added scatter-gather functions
  + axl_lua: added an implementation for lua_len for lua 5.1 (and below)
  + axl_gui: added gui::HyperText::setText, appendText with a bool paremater
    isHyperText
  + axl_gui: added support for gradients
  + axl_sl: added explicit copy ctors Iterator -> ConstIterator
  - axl_sl: fix: ArrayRef should const-cast array pointer on attach
  - axl_io_pcap: fix: pcap_open_dead 1st arg is link type, 2nd arg is snaplen
  - axl_lex: fix: error token should stop tokenization (even if tokenize count
    limit is not reached)
  - cmake: fix: link __wrap_fcntl even if not directly called
  * axl_io: swap bytes for ip4 in SockAddr.setup(...)
  * axl_gui: gui::HyperText::findHyperlinkByOffset should return NULL if offset
    is beyond the text length
  * axl_io: added axl::io::win::getWindowsDir() / axl::io::win::getSystemDir()
  - axl_enc: fix: prevent sign-expansion of a character before passing it to
    isprint()

................................................................................

version 3.11.1 (2019-07-30)

  Service release: Run-as-Adminitstrator fix, lowered GLIBC version requrements,
  auto-detection of J-Link library path.

  Main application changelog:

  - nj_srv: fix: ensure non-zero full compile time (used as a divisor)
  * axl_glibc: added wraps for math functions and for fcntl on x86
  * axl_sys: added dynamic linking to libudev and use it serial port enumerator
  * axl_sys: rename: DynamicLibrary -> DynamicLib
  * axl_io: hardcode USB errors
  * axl_glibc: a new library with GLIBC wrappers for improved compatibility
  * license: update the license terms
  * nj_srv: removed dependency on libusb & libudev
  * nj_srv: process log server requests without enqueuing to worker thread
  * nj_app: show main window *before* loading plugins
  * nj_app, nj_srv: added support for platform-specific scripts
  - nj_srv: fix: elevator should enclose space-containing arguments in
    quotation marks
  - package/msi: fix: added ioninja-server-admin.exe

  Scripts changelog:

  * jlink-rtt: auto-detect location of jlink dll
  * jlink-rtt: throw on error in connect (otherwise, the error is not logged)
  * common: added standard paths to jlink dll
  * tcp-connection: improved handling of the reconnect timer
  * socket-log: added SocketLogRecordCode.ReconnectDelay

  Device Monitor changelog:

  - dm_lnx_lkm: fix: typedefs.h was not included into the project (and
    hence, missing from the package)

  Jancy changelog:

  * jnc_sys: added sys_Registry.jnc with class sys.RegKey for registry access
    on Windows
  * jnc_dll, jnc_io_base: removed dependency on libusb & libudev
  * jnc_rtl: update re latest axl rename DynamicLibrary -> DynamicLib
  - sphinx: fix: regex for char literals
  * jnc_ct: major update: calculate type signatures lazily; don't calclayout for
    function types
  * jnc_ct: thunk properties don't need to keep signatures

................................................................................

version 3.11.0 (2019-06-30)

  Introduces: new J-Link RTT plugin, new Serial MI Dump Viewer plugin, new layer
  UI, applying layer to .njlog files, run sessions as Administrator on Windows,
  signed .exe on Windows, support for RTS-driven half-duplex Modbus over RS-485,
  direct foreign data pointers in Jancy for increased host-to-script
  communication efficiency.

  Main application changelog:

  - nj_app: fix: use the latest security patch openssl-1.0.2s
  - nj_app: fix: mark user plugins *before* adding to the list (so the list
    shows paths in tooltips)
  * nj_app: user plugin page should use 16x16 icons (for consistency)
  + package: sign ioninja.exe, ioninja-server.exe, ioninja-server-admin.exe
    this way, elevation prompts look better (blue and with an icon)
  * nj_app: don't show "Run As Administrator" on pre-Vista Windows (ver < 6)
  + nj_srv_adm: added a thread for pumping between STDIN and the STDIN named
    pipe
  + nj_srv: added option: --stdin-pipe with this option, StdinThread is reading
    from the pipe instead of STD_INPUT_HANDLE (required for elevation)
  + nj_srv: added an icon to ioninja-server.exe & ioninja-server-admin.exe
  * nj_srv: ioninja-server-admin is now an elevator (creates a ioninja-server
    via ShellExecuteEx)
  - nj_srv: removed app-srv & srv-app transport file handles (unused)
  - nj_etx: fix: clear module if jitting fails (otherwise, we end up with a
    module in a weird half-baked state)
  + nj_etx: set error in processMsg_OnActionError (may happen during compile
    stage, so we need srcpos for error highlighting)
  + nj_ui: added ComboBox::setItems (also, unified ComboBox item and
    EnumProperty item)
  - nj_app: fix: incorrect check for UserPluginFlag in
    UserPluginSettingPage::on_removeButton_clicked
  - nj_app: typo fix in TransmitHistory::last()
  - nj_app: fix: followRedirectGet always returned false
  - nj_app: fix: uninitialized fields in DocumentLayer
  - nj_srv: fix: uninitialized field Server::m_paths
  + nj_app, nj_ui: add document groups for logs, too; also, initially populate
    document groups with an "empty" prop so it looks more consistent
  - nj_srv: fix: properly handle start of log documents (now that we can add
    layers on logs, too)
  + nj_app: added Plugin::PureLayerFlag (can be applied to log files)
  * nj_app: rename: SessionSettingPage -> DocumentSettingPage -- this setting
    page now applies to log documents, too
  - nj_srv: removed CmdLine::m_workingDir
  - njs_log: fix: converters/filters were not removed from the aux list
    (m_conversionPipeline)
  - nj_app: fix: main plugin entry was not added when opening logs
  - nj_srv: fix: processMsg_OrderLayers should not call removeAllConversions
  * nj_app: major update: use LayerPipelineDlg for pipeline management
    allows adding layers duding session startup and most importantly,
    re-ordering of layers
  + nj_app: added LayerPipelineDlg, removed add/remove/removall buttons from
    SessionSettingPage (now everything is managed from within LayerPipelineDlg)
  - nj_ui: fix: add spacing widget to the object map (so it's get deleted on
    layer removal)
  + nj_srv: force-process doc_MainThreadScheduler.jnc
  * nj_cmn, nj_srv: removed SrvMsgCode_RemoveAllLayers, added
    SrvMsgCode_OrderLayers
  + nj_log: added support for moving conversions/listeners to the tail of
    pipeline
  * nj_etx: create foreign pointers instead of memdup/strdup
  - nj_app: fix: nagmgr failed on parsing an empty manifest
  * nj_app: rename: new layer -> add layer
  * nj_srv, nj_ui: jnc::g_nullPtr -> jnc::g_nullDataPtr
  + nj_app: process terminal status reports
  * nj_app: use QLinkedList<> where possible: more efficient than QList<>
    keeps iterators valid
  + nj_srv: added an option for logging or not logging exception in the main
    log;
  - nj_srv: fix: don't log exception from the 'log' submodule
  - nj_srv: fix: on exception, don't try to write to a read-only log file
  * all: major renaming and moving-things-around: gui -> ui io.XxxUi ->
    ui.XxxUi, log.RepresenterTarget -> log.Representation
  - axl_sl: fix: properly handle count == -1 in sl::Array::remove and
    sl::String::remove
  - axl_gui: typo fix: mask should check for (1 << Orientation_Xxx)
  * axl_enc: HexEncoding::Flag -> HexEncodingFlag
  + axl_enc: added HexEncodingFlag_Multiline (for debugging)
  - axl_lex: fix: skipping BOM resulted in invalid offsets in
    Token::m_pos (which affected modules relying on Token::Pos::m_offset)
  + axl_lex: ignore UTF-8 BOM by default
  + axl_sl: added from-index parameter to all String::findXxx
    methods
  - axl_enc: critical bugfix: potential buffer overflow in
    CodePointDecoder::decodeImpl

  Scripts changelog:

  + ethernet-tap: added icon to the log plugin
  + serialmon: added a new plugin: Serial MI Dump Viewer
  + file: added a simplified FileOpened log record (file name only)
  + conf: added JLinkRtt to the list of official plugins
  + conf: added SerialMiDumpView to the list of official plugins
  * conf: added FpgaUploaderLog.njplg to the std plugin list
  * conf: added scripts/plugins as a common import dir
  - jlink, modbus, ssh: remove ../ prefix for shared log record code files
  * ethernet-tap: use the newly-added shared FPGA-uploader
  * i2c-spi: use the newly-added shared FPGA-uploader
  + fpga-uploader: moved FPGA update code to a common plugin (shared between all
    FPGA-based sniffers)
  * replay-log: moved log_RecordFile.jnc to common/
  + jlink: added support for socket connection to existing localhost session
  * ui: use ComboBox.setItems() in ToolBar.addComboBox()
  + packets: added ModbusReadWriteMultipleFrame
  + packets: added updateSize() packet action
  + modbus: added support for read/write multiple registers, mask-write register
  + jlink: added device list refresh, jlink info/error trace, attach to existing
    session
  * modbus-gateway: moved to misc group
  * common: sys.GcXxx -> jnc.GcXxx
  + ui: added ui.ComboBox.setItems (optimization -- to set all items in one go)
  + jlink: initial commit of J-Link RTT
  + common: added io_JLink.jnc (binding to the JLink dynamic library)
  - mailslot: typo fix in MailslotLog.njplg
  * common: BufferPropertySet.createPropertiesGrouped should return
    GroupProperty*
  + modbus: redesigned half-duplex parsing, added options for RTS-control in
    half-duplex mode
  * ethernet-tap: renamed "Ethernet Sniffer" -> "Ethernet Tap"
  + ethernet-tap: added a firmware file
  + ethernet-tap: added PacketFlags.BufferOverflow
  + ethernet-tap: show software-calculated CRC status
  * modbus: reset parsers in log.Converter.reset()
  + modbus, regex, replay, tx-rx-filter: added pure-layer = true
  * api: moved MainThreadScheduler to a dedicated file
    (doc_MainThreadScheduler.jnc)
  + api: added log.FoldingFilter, updated log conversion stack methods
  + modbus: added setting for choosing which stream to analyze in
    half-duplex mode
  + ethernet-sniffer: added channel filters, use different backgrounds for
    channel#1 and channel#2
  * ethernet-sniffer: collapse everything by default
  - pcap: fixed null-exception on empty filter
  - modbus: fix: device address 0 means: write-only broadcast
  * all: major renaming and moving-things-around
  - packets: fix: IcmpFrame::calcChecksum did not update the second (ICMP)
    checksum

  Ninja Scroll engine changelog:

  * njs_log: major redesign of ConversionMgr
  * njs_log: maintain live record offset and don't call listeners for non-live
    records
  * njs_log: major update: respect sequence of filters in conversion stack
  + njs_log: added class FoldingFilter
  + njs_wdg: process CSI 5 n and CSI 6 n (report status)
  - njs_log: critical bugfix: potential crash on save-log-as-text
    when using bin-text-view
  * all: rename: RepresenterTarget -> Representation, RepresenterBuffer ->
    PartBuffer

  Device Monitor changelog:

  * dm_lnx_lkm: conditional compilation to make it compile with older kernels
  * dm_lnx_lkm: use explicit #ifdef/#ifndef to avoid warnings on older GCCs
  - dm_lnx_lkm: removed unnecessary typedefs in HashTable.h
  * dm_lnx_lkm: a workaround for older GCCs which disallow multiple identical
    typedefs
  * dm_app: added rt to the lib list
  * dm_app: use (utf32_t) cast as to avoid problems on older GCCs
  * dm_lnx_lkm: don't use multi-char constants (yields warnings on older GCCs)

  QT Property Browser changelog:

  - qtpb: fix: text editor was not bound to the file property value
  + qtpb: added support for name icons

  Jancy changelog:

  + jnc_std: added strrchr, strpbrk
  * jnc_sys, jnc_rtl, jnc_ct: moved GC runtime functions to RTL, cleaned up lazy
    item parsing/adding
  + jnc_std: added atol & strtoul, fixed strtol (should return int64_t)
  + jnc_ct, jnc_rtl: added jnc.createDataPtr for converting thin-> normal ptrs
  - jnc_ct: fix: lower priority of non-const -> const casts
  - jnc_sys: fix: sys.NotificationEven was not mapped
  - jnc_sys: removed sys.createThread() -- it never was implemented; anyway,
    it's better to use sys.Thread
  - jnc_ct: fix: super-import type resolving/import loop detection was broken
  + jnc_ct: add fixups for import types in typedefs
  - jnc_ct: fix: srcIface used before null-check in Cast_ClassPtr::constCast
  - jnc_ct: fix: incorrect arg names when adopting non-user orphans (e.g.
    property accessors)
  - jnc_ct: typo fix: incorrect check for ScopeFlag_FinallyAhead
  - jnc_ct: fix: a few uninitialized members found by pvs-studio
  - jnc_io_base: fix: unintialized field io::Serial::m_lineErrors
  - jnc_api: warning fix: using bool_t for bool
  - jnc_io_usb: typo fix: incorrect checking for Flag_Stop inside ASSERT
  + jnc_rt: added optional root dump during mark stage (helps detecting bogus
    pointers)
  - jnc_ct: fix: ImportMgr::findImportFile should still work if current unit is
    not set
  - jnc_api: fix: jnc::Module::addImport should return bool
  * jnc_rt, jnc_api: changed DataPtr method signatures void* -> const void*
    (more convenient to use)
  + jnc_api: added jnc::createForeignBufferPtr, jnc::createForeignBufferPtr
    (convenient helpers)
  * jnc_api: jnc::strLen, jnc::strDup, jnc::memDup are no longer exported via
    the dynamic extension func table (linked statically)
  - samples: fix: default for isCallSiteLocal is true now; also, use
    GcHeap::invalidateDataPtr
  + jnc_rt, jnc_api, jnc_dll: added methods: GcHeap::invalidateDataPtr and
    invalidateDataPtrValidator
  * jnc_rtl: added a shortcut (for null) in appendFmtLiteral_p
  * jnc_dll: export jnc_GcHeap_createForeignDataBox &
    jnc_GcHeap_createForeignBufferPtr
  * jnc_api: renamed BoxFlag_Zombie -> BoxFlag_Destructed (more explicit)
  * jnc_api: increased size for Box::m_flags to 10 bits
  + jnc_rtl: added checks for BoxFlag_Invalid
  - jnc_ct: removed the 'lib' argument from jnc::Module::parse
  - jnc_api: removed include of jnc_Runtime.h (unnecessary and causes errors
    under gcc)
  * jnc_ct: invalidate callsite-local boxes upon exiting a callsite
  + jnc_rt: implemented GcHeap::createForeignDataBox/createForeignBufferPtr
  + jnc_rtl: added jnc.Promise.asyncSetScheduler
  + jnc_ct: added 'thisPromise' to async sequencer funcs
  - jnc_ct: fix: m_multicastClassTypeArray was not cleared
  - jnc_ct: fix: OperatorMgr::memSet(...) doesn't accept alignment as a
    parameter anymore
  - jnc_ct: fix: memCpy/memSet alignment arg is no more (use 1)
  - jnc_ct: fix: llvm.memcpy/memmove/memset changed signature in llvm-7.0.0
  - jnc_ct: fix: reset debug loc in FunctionMgr::prologue
  + jnc_ct: include LLVM_VERSION_PATCH into LLVM_VERSION
  * jnc_ct: debug info updates for llvm-8.0.0
  * jnc_ct, jnc_rt: replaced StaticDataBox -> DetachedDataBox (with built-in
    Validator)
  - jnc_ct, jnc_rt: removed DynamicArrayBox (element count can be reconstructed
    from DataBox::m_validator)
  - jnc_ct: fix: create execution engine prior to optimization
  * jnc_ct: use "generic" for CPU
  - jnc_ct: llvm-8.0 compatibility fixes

................................................................................

version 3.10.5 (2019-04-10)

  Service release (SPI firmware fix, UTF-decoder fix)

  Main application changelog:

  - axl_enc: critical bugfix: opportunistic buffer overflow in
    CodePointDecoder::decodeImpl
  * nj_app: upped max hex line length to 64
  - nj_app: fix:  force update license in LicenseMgr::setRegistrationState
    (otherwise, evaluation -> paid is not handled)
  - axl_sl: fix: String::getXxxCaseString must be const
  + axl_sl: added support for literal + string concatenations

  Scripts changelog:

  - i2c-spi: critcal fix: fixed spi.rpd firmware
  + ethernet-sniffer: added graceful stop (with cypress buffer clear)
  - ethernet-sniffer: fix: RJ45 connector (channel) identification
  + ethernet-sniffer: show packet index

  Jancy changelog:

  - jnc_ct: fix: replace '.' with '_' for namespace ref-ids
  + jnc_ct: accept multiline post-comments /*!< ...
  * jnc_ct, jnc_dll: moved doxy-comment processing into axl (to be shareable
    with other doxyrest-pipeline front-ends)
  + jnc_ct: opt: avoid escape-decode when there are no backslashes in string

................................................................................

version 3.10.4 (2019-03-29)

  Service release (io.Pcap fix)

  - jnc_io: fix: io.Pcap used a wrong code for EOF (in 3.10.3 it was causing
    TCP Flow Monitor, UDP Flow Monitor and Network Sniffer to stop capturing
    immediately)
  - jnc_app: fix: command line should use something else for output dir (-O is
    used for optimizations)
  * nj_app: do initial repaint before enabling network (which is not instant)

................................................................................

version 3.10.3 (2019-03-28)

  Introduces: new 'Replay Log' plugin, new 'I2C/SPI Tap' plugin, communications
  with ioninja.com moved to HTTPS, added support for async/await in Jancy, added
  LLVM inlining and optimization passes in Jancy, support for BREAK condition
  in Serial and Serial Monitor.

  Main application changelog:

  - package: removed the 'drivers' component from the 7z package (and into a
    separate package for those who need it)
  + sh: added support for cmake toolset param (-T); allows using VS2017 to build
    for Windows XP
  - nj_app: removed encryption of usage/crash reports, replaced everything
    with HTTPS
  + nj_app: added a setting for hex digit case
  * nj_app: updated welcome dlg (proper format for serial numbers, changed the
    type of the license field to rich-text)
  * license: updated the privacy statement (re HTTPS stuff)
  + license: added libusb (linked into io_usb.jncx)
  - license: removed lua & zlip (not really linked into ioninja)
  * doc: updated the HW manual
  + nj_app: added log-stop icon
  * nj_srv: update startup progress post-optimize
  + nj_app: added LLVM optimization-level settings (-O<n>)
  - nj_app: fix: ScriptEdit::event may be called before m_lineNumberMargin is
    initialized
  + nj_srv: use the newly added jnc::Module::optimize
  + conf: added i2c-spi-sniffer as a stock plugin
  - nj_app, nj_srv: removed setting for max stack size
  * nj_app: removed unneeded space from binary transmit page
  * nj_app: save settings as defaults when the Settings dialog is closed on OK
    button
  + nj_app: added path info for user plugin tooltips
  - nj_gui: bug: getItemData was non-static (ABI inompatibility due to
    structret-vs-this)
  + icons: added tape icon (for replay-log)
  - nj_srv: fix: removing layer which has log plugins resulted in dangling
    pointers
  + nj_log: added support for unloading log plugins
  - nj_app: fix: dangling pointers in packet template combo-box (need to set
    packet template to null on document deactivate)
  + axl_gui: added flags arg to TextPainter::drawBinHex (so we can choose
    upper/lower case)
  * doc: cleaned up sphinx CSS & templates
  + cmake: added IPO as LLVM JIT component (now that we use function inlining
    pass)
  + axl_gui: added support for strikeout ANSI escape \e[9m \e[29m
  + axl_io: added Serial::setBreakCondition(bool)
  - axl_mem: fix: TrackerBlockHdr should be aligned on dual-pointer-size
    boundary

  Scripts changelog:

  * tcp-proxy: keep server data until the connection is established
  * tcp-proxy: wait for TX buffer empty on disconnect
  - tcp-listener: typo fix: TcpListenerSession.onConnectionSocketEvent used
    incorrect socket pointer on io.SocketEvents.IoError
  - common: removed duplicate RemotePort property
  + i2c-spi: added support for flipping MOSI/MISO
  * i2c-spi: renamed I2C/SPI Sniffer -> I2C/SPI Tap
  * i2c-spi: updated firmware files
  * i2c-spi: fixes/updates for I2C 10-bit address mode
  * wizards: use StdLogIcon.Connect/StdLogIcon.Disconnect in the
    Session wizard
  + api: added StdLogIcon.Stop
  + serialmon: added handling for IOCTL_SERIAL_SET_BREAK_ON &
    IOCTL_SERIAL_SET_BREAK_OFF
  - serial: fix: BreakConditionChanged was not added to SerialLog.njplg
  * serial: adjusted levels in the BRK icon
  + ethernet-sniffer: initial commit
  + i2c-spi-sniffer: implemented proper decoding for different SPI modes
    (MSBit-first/LSBit-first for 4, 8, 12, 16 bits)
  + i2c-spi-sniffer: added graceful stop (with clearing Cypress buffers)
  * serial: updated the BRK icon
  - common: fix: invalid througput calculation for TxRx (need to
    divide by 2)
  * hw-serial-mon: use the newly added API (io.UsbEndpoint.unsuspend)
  * tcp: use the newly added API (io.Socket.unsuspend)
  * usb-data-endpoint,usb-control-endpoint: use the newly added API
    (io.UsbEndpoint.unsuspend)
  + usb-data-endpoint,usb-control-endpoint: added persistency for device
    selection;
  - i2cspi: fix spi decoder (last byte was lost when buffer was full); also,
    flush buffer on each decode()
  * i2cspi: don't expect bytes to necesserily arrive AFTER
    i2c-start (we can start sniffing in the middle of a packet)
  * i2cspi: clear cypress buffer on start
  * i2cspi: handle ACK/NACK in the I2C address, don't adjust incomplete bit
    count in STOP msg, added properties for log cache update rate limit
  + serial: added a button to set BREAK condition
  + replay-log: initial commit
  + serial-tap: added line error handling (framing/parity/break)
  + serial: added line error handling (framing/parity/break)
  - modbus: fix: stream role was not properly loaded (resuling in the default
    value every time)
  - modbus: fix: ModbusRtuParser.m_lastTimestamp field shadowed
    the "real" m_lastTimestamp in the base class, thus resulting in invalid
    timestamp handling

  Ninja Scroll engine changelog:

  + njs_log, njs_wdg: added HexLineWidget::isUpperCase/setUpperCase
  - njs_log: fix: only update the previous line (timestamp, style) if
    new characters are added to it
  - njs_log: fix: update IndexLeaf before invoking getNextLeaf/getPrevLeaf
    (index file might have grown thus adding extra leaves and thus updating
    m_next -- while cached leaf may have m_next == -1)

  Jancy changelog:

  - jnc_io_base: fix: WSAECONNRESET was not always handled
  + jnc_io: added io.XxxEvents.WriteBufferEmpty (currently, WriteBufferReady
    is aliased to it)
  - jnc_ct: fix: use m_llvmFunctionName/m_llvmGlobalVariableName only if it's
    not empty
  * jnc_ct: alas, we have to resort to looking up llvm::Function &
    llvm::GlobalVariable by name on mapping -- i can't figure out a way to be
    notified when llvm::Function is being optimized out
  - jnc_ct: typo fix in Variable::prepareStaticData
    (llvm::GlobalVariable was still accessed for optimized-out vars)
  + jnc_ct: optimize sourceless functions, update m_staticData when mapping
    variables;
  + jnc_rt: handle SIGILL (optimizer may replace NULL-pointer accesses with UD)
  + jnc_app: use the newly added jnc::Module::optimize
  + jnc_ct,jnc_api: added Module::optimize (using llvm::PassManagerBuilder)
  * doc: updated sphinx conf.py.in according to the latest changes in axl &
    doxyrest
  - jnc_ct: fix: getDataPtrType should add fixup for import types
  - jnc_ct: typo fix: getPtrTypeFlagSignature added 'cn'(intended "cn");
    better yet, use single-char signatures
  + jnc_ct: added options for inlining & basic scalar opts
  - jnc_ct, jnc_rt: removed explicit stack size limit (handled via exceptions)
  - jnc_ct: removed GC safe points in prologues by default
  * jnc_io: accepted sockets/named-pipes and usb IN-endpoints should be
    suspendable (initially)
  + jnc_ct: added support for scheduling async functions
  * all: rename: VTable -> Vtable
  + jnc_ct: added support for async errorcode functions
  + jnc_ct: added support for async member functions ('this' value is added to
    the promise class)
  * jnc_ct: made Function/Variable/Value/Type getLlvmValue inline
  * jnc_ct: moved ct::GlobalNamespace and ct::ExtensionNamespace into dedicated
    files
  - jnc_ct: removed m_declaratorName from function (only orphans need those)
  * jnc_ct: make qualified name calculation lazy
  - jnc_ct: removed names from unnamed functions
  - jnc_ct: removed ModuleItem.m_tag
  * jnc_ct: moved m_doxyBlock to ModuleItemDecl
  - jnc_ct: removed BasicBlock.m_landingPadKind (use BasicBlock::m_flags)
  - jnc_ct: removed explicit checks for null-ptr, zero-div, stack-overflow
    (handled via exceptions)
  + all: the first prototype of async/await is finally functional
  - jnc_io_usb: fix: UsbAsyncControlEndpoint::markOpaqueGcRoots
    should lock prior walking the list (libusb completion can modify the list
    any time)
  - jnc_io_cmn: fix: enter wait region in AsyncIoDevice::blockingWait
  + jnc_io_base: added serial line error handling (io.SerialLineErrors,
    io.SerialEvents.LineError, io.Serial.clearLineErrors)
  + jnc_rtl: added a draft for jnc.Promise/Promisifier
  + jnc_ct: added TokenKind_Async, TokenKind_Await, TypeModifier_Async
  - jnc_ct: removed TokenKind_Auto

................................................................................

version 3.10.2 (2019-02-01)

  Service release

  Main application changelog:

  * nj_app: changed default font to Consolas-10 on windows, Menlo-12 on Mac,
    Monospace-10 otherwise
  * nj_app: use the script editor font for line number margin
  * nj_app: detect font changes and update accordingly
  * nj_app: added a size-grip to the parametrized action dlg and removed the
    question mark from the caption
  - nj_app: fix: switching between sessions might have left BinaryTransmitPage
    with a dangling m_settings pointer (leading to a crash)
  + nj_app: added auto-show-terminal setting (false by default)
  + nj_app: attempt to auto-load log plugin if it's in the same directory
  + nj_app: added new setting: auto-add-user-plugin
  * nj_app: when opening log file with aux representers, don't suspend log
  + nj_app: use the newly added njs::NotifyCode_SelectionChanged
  - nj_app: fix: load/save sessions still relied on plugin guids rather that
    ids (and we removed guids from session/layer plugins)
  - axl_enc: remove the expectedLength/Size parameters from conversion functions

  Scripts changelog:

  + tcp: added the reconnect functionality (on remote disconnet/reset)
  + serial: added the reopen-on-error functionality
  + usb-data: added read-timeout & use-read-timeout props; use those for proper
    buffer configuration
  + common: added configurable defaults to BufferPropertySet
  - wizards: fixed reswitch code in layer plugin wizards
  * wizards: updated wizards for the new plugin arch
  * serialtap: rename: serial tap doesn't use FTDI anymore
  - serialmon: fix: representSerialMonLog should not fall back to
    representSerialLog
  + serial: added icons to serial log plugin
  - tcp: fix: on error, transmit should be disabled and session ended

  Ninja Scroll engine changelog:

  - njs_log: fix: when adding text we should add an extra line when text ends
    on new-line (\n)
  - njs_log: fix: CacheLineAttr.clear should reset m_iconIdx to -1
  - njs_log: typo fix: RecordFile::getAuxClassGuidArray () mapped
    a view at a wrong offset
  - njs_log: typo: SaveLogAsTextRangeProcessor should use
    m_lineTimestamp, not m_timestamp
  - njs_wdg: fix: keep the line color when painting hex-ascii
  - njs_wdg: fix: hex editor crashed if a user starts typing in the hex pane
    in overwrite mode and the editor is empty
  + njs_wdg: added NotifyCode_SelectionChanged

  Jancy changelog:

  - jnc_rtl: bugfix: 'this' arg of 'onevent' handlers was adjusted twice
  + jnc_rtl: make RegexState.m_replayLength public & readonly (may be needed)
  * cmake: moved all rtl .jnc files into src/jnc_ext/jnc_rtl
  + jnc_ext: create jnc_stdlib.jncx for IO Ninja IDE
  - jnc_io_ssh: fix: read initially from socket (otherwise, data may be stuck
    in libssh2 buffers until more data arrives over a socket)

................................................................................

version 3.10.1 (2018-12-25)

  Service release

  Main application changelog:

  + nj_app: added test mode -- load plugin(s) and wait a bit, then exit
    (added all official plugins to the test list)
  - nj_cmn, nj_app, nj_srv: removed AppMsgCode_OnException -- it was only used
    if the initial plugin startup failed. replaced with onStartupCompleted;
    this also leads to reduced flickering during plugin startup
  - nj_app, nj_srv: fix: use proper libunwind libnames and link sequence
  - nj_cmn: fix: only use signalContext on Linux x86/amd64
    otherwise, use unw_getcontext (which pretty much works everywhere)
  + nj_app: force-generate cursorPosChanged in HexEditWidget::selectAll ()
  - nj_app: fix: install crash report writer BEFORE jancy initialization (for
    proper sequence of signal handlers)
  + nj_cmn: added SIGILL to the signal list -- turns out, clang may replace
    invalid memory accesses with UD instructions
  - nj_app, nj_srv: don’t link to libunwind on mac (it’s part of standard
    lib here)
  * nj_cmn: moved posix crash report thread writer to a dedicated file
  + nj_cmn: implemented crash reports on posix using libunwind
  - nj_app: fix: user plugin page didn't work well for log plugins (new plugin
    type was not handled properly)
  * nj_srv: return --plugin-file option (for old ioninja-ide compatibility)
    loosen up errors in CmdLineParser::finalize (simpy don't set server flags
    if log files are not specified)
  - nj_app: don't call QNetworkProxyFactory::setUseSystemConfiguration at all
  * nj_app: check for running state during execSyncReq and Document::save
    this is to prevent main-app lock ups due to zombie server
  * nj_app: licensemgr should update about dialog (if present)
    example sequence: about->deregister->nag->register
  * nj_app: nagdlg: don't set time-left-string if it's not evaluation

  Scripts changelog:

  * i2c-spi: updated firmware files (both i2c and spi are functional)
  - all: removed guids from layers
  + all: added icons to all log plugins
  * i2c-spi: major update -- no more lattice, implemented altera max10
    upload protocol
  - tcp-flow-mon: typo fix: guid-> log-guid

  Jancy changelog:

  * jnc_ct: major update: raw literals are now zero-terminated, just like
    normal literals (practice showed it's safer and better this way)
  - jnc_io_usb: minor warning fix (signed-vs-unsigned mismatch in assert)
  - jnc_ct: fix: incorrect assert -- unprimed static gc root classes have
    NULL box

................................................................................

version 3.10.0 (2018-12-14)

  New major features:

  A build for Raspberri Pi, machine interface in Device Monitor, a new plugin
  Serial Monitor over SSH, half-duplex support in Modbus Analyzer, redesign of
  Jancy reactors, new 64-bit log record code architecture, dedicated log
  representer plugins (separated from session/layer plugins).

  Main application changelog:

  * nj_app: for default session and layer plugins, use ID rather than GUID
  * nj_app: if no plugin selected, getPluginListWidgetCurrentItem should return
    NULL
  * nj_app: update: instant-nag-screen should only pop once
  * nj_app: prevent silent overwriting of the outdated log file (create a
    backup and show warning with a link to the KB article)
  + nj_log, nj_app, nj_srv: added configurability for record code filter
    groups via bool properties
  + nj_log: added standard filter RecordCodeFilter
  + nj_gui: allow creating BoolProperty without a jancy runtime
  * nj_log: lock before compiling log plugins to avoid races between multiple
    log threads
  - nj_srv: fix: addLayer didn't work properly on the new log design
  - nj_app: fix: no-response-dlg should be closed when server process terminates
  * nj_srv: fail if log plugin failed to attach (usually, because of a
    misspelled representer func)
  + nj_app: added presell serial num page to the welcome dialog
  - nj_app: typo fix in TextTransmitPage::onEnterKeyPressed (no need to take
    parent)
  - nj_srv: fix: erase entry from the layer map if add-layer failed
  + nj_app: added welcome-dialog (blocking unregistered access) -- a license
    is now required to run io ninja (at least, an evaluation one).
  * all: ensure zero-initialization where it matters (post auto-zero-init
    removal from axl)
  - all: removed auto-zero-init of allocated blocks
  - nj_app: qt-5.0.2 fix in UsageReportMgr re QJsonValue
  * sh: added target cpu mapping armv7l -> arm32
  + conf, cmake: added ssh-serialmon to the official plugin list and to the
    test suite

  Scripts changelog:

  - serialmon: removed unnecessary termios->uint_t converters
  + serialmon: added handling of TCSETSW, TCSETSF, TCSETA, TCSETAW, TCSETAF
  - pcap: typo fix: should check *filter, not *p (which is void)
  + serialmon: added serial monitoring over ssh
  * ssh: moved common ssh ui code into io_SshUi.jnc
  * udp-flow-mon, tcp-flow-mon: reuse log record codes from PcapLog and
    SocketLog
  * all: all-around-fixes, everything passes tests under the new
    64-bit record code design
  + devicemon: added device monitor log plugin
  * all: ported to the new 64-bit record code design
  + modbus: added support for half-duplex links
  * all: updated reactors re the new reactor syntax/capabilities

  Ninja Scroll engine changelog:

  + njs_app: implemented conversion for record codes 32-bit ->
    64-bit (record-code-db-driven)
  * njs_log: moved RecordFilePreOpener to a dedicated file
  + all: 64-bit record/part codes
  - all: a bunch of typos/fixes found by pvs-studio
  * all: ensure zero-initialization where it matters (after
    auto-zero-init removal from axl)

  Device Monitor changelog:

  - dm_app: minor posix fix re StdinThread
  + dm_app: monitor EOF on STDIN (important for SSH connections)
  + dm_app: added os/cpu information to the start message, renamed
    dm_MachineInterface.h -> dm_MachineIface.h
  * dm_app: turn off stdout buffering in machine-interface mode
  + dm_app: implemented machine interface on linux
  + dm_app: added machine interface (output binary to stdout for
    easy parsing -- e.g. over SSH)
  * lkm: replaced flush_tlb_all (not exported on rpi2) -> local_flush_tlb_all

  Jancy changelog:

  + jnc_io_devmon: build io_devmon.jncx even if devmon is not available
  + jnc_ct: added support for source-only jncx extensions
  - jnc_ct: fix: conditional_expr didn't check for result of conditionalJump
  - jnc_pch: removed empty preproc line (confuses cppcheck)
  - jnc_io_ssh: don't request PTY if ptyType is null or empty
  - jnc_io_ssh: don't start process if processType is null or empty
  + jnc_std: added overload std.setError (std.Error const*)
  + jnc_io_devmon: added io_DeviceMonitorMi.jnc (machine interface)
  + jnc_ct: added __FILE__ and __DIR__ lexer-time constants
  - jnc_rt: fix: Runtime::m_module was uninitialized
  + jnc_std: added methods: std.Guid.parse, std.Guid.getString
  - jnc_ct: fix: NamedTypeBlock::callMemberFieldConstructors
    should not assume this is a class type
  + jnc_rt: add destructors of class field of static objects
  - jnc_io_base: fix: struct OverlappedIo had uninitialized fields
    (windows-only)
  - jnc_ct: fix: DerivableType::findItemTraverseImpl shouldn't assume no
    unresolved imports in base types
  + jnc_ct: added a bunch of arm arithmetic/conversion impl functions
  + jnc_ct: force hard-fp-abi on ARM
  - jnc_ct: fix: arm32 coercion (should depend on alignment)
  - jnc_ct: fix: 'char's are unsigned on ARM
  + jnc_ct: arm call-conv implemented (not fully tested yet)
  + jnc_ct: added arm calling convention (draft)
  + test, cmake: added jnc_test_abi to the test quite and make it run
    before the other tests (except for samples)
  + jnc_ct: added support for arm32/arm64
  + pch: detect arm32/arm64
  - pch: fix: don't use attribute(ms_struct) if it's not supported
  * jnc_ct: moved deletion of llvm::Module, llvm::ExecutionEngine
    and llvm::Context to the very end of ct::Module::clear
  - jnc_ct: typo fix in Function::addUsingSet
  - jnc_dll: fix: Xcode refuses to build a library out of TARGET_OBJECTs only
  + jnc_io: added WSAStartup on windows to io_base.jncx/io_ssh.jncx
  - jnc_ct: fix: pass Token::Pos to internalPrologue (otherwise,
    m_llvmDiScope is not initialized)
  + jnc_ct: added optional Token::Pos* pos arg to FunctionMgr::internalPrologue
  - jnc_ct: fix: incorrect include dir sequence
  - api: removed empty pp lines (containing only #) -- they confuse cppcheck
  - jnc_ct: fix: call postDeclaratos/postDeclaratorName when parsing reactors
  + jnc_ct, jnc_rtl: allow empty reactors
  - jnc_ct: fix: delete llvm::Context in Module::clear
  - all: a bunch of typos/fixes found by pvs-studio
  - jnc_ct: don't create vtable for a class unless it's actually needed
  * all: ensure zero-initialization where it matters (post auto-zero-init
    removal from axl)
  * jnc_rtl: use shadow reaction index to loop through pending reactions
    (rather than picking the pending reaction with the minimal index)
  + jnc_rtl: added method ReactorBase.restart
  - jnc_ct: fix: ensure reactor-closure type is created together with
    jnc.ReactorBase
  - jnc_ct: fix: jnc.ReactorBaseType should mark ctor/dtor as user-item
    (otherwise, these will be auto-generated)
  * jnc_ct: minor modification of the signature of
    DerivableType::createDefaultMethod
  * test: updated reactor samples/tests to the new syntax
  + jnc_ct, jnc_rtl: initial commit of reactor-redesign

................................................................................

version 3.9.2 (2018-09-27)

  Service release

  A bunch of critical bugfixes in Jancy runtime and in the Ninja Scroll engine
  (after a series of tests with libfuzzer + address sanitizer); added delayed
  cache update in Ninja Scroll (critical to maintain high data throughput,
  such as with the I2C/SPI Sniffer plugin capturing SPI data at ~50MHz).

  Main application changelog:

  + nj_log: added properties: Log.m_leafLineCountLimit,
    Log.m_cacheUpdateScrollRateLimit
  + nj_app: use the newly added LogWidget::setStickyScroll
  * nj_app: set ScrollToBottom & SetCursorToEnd flags on clear
  - nj_app: fix: gcSafePointMethod setting was neither serialized nor applied
    on win x64
  + nj_doc: added property: doc.PluginHost.m_pluginDir
  - nj_gui_srv: fix: EnumProperty::setValue should check for null before the
    shortcut exit (may be setting 0 to null)
  * doc: updated hardware manual

  Scripts changelog:

  + i2c-spi-sniffer: use the newly added m_cacheUpdateScrollRateLimit to limit
    log cache update rate
  + log: added properties: Log.m_leafLineCountLimit,
    Log.m_cacheUpdateScrollRateLimit
  + i2c-spi-sniffer: added automatic FPGA firmware update
  + common: added file parseVersion.jnc
  - log: bugfix: infinite recursion in log.Writer.writeString
  + doc: added property: doc.PluginHost.m_pluginDir
  - i2c-spi-sniffer: remove io.UsbEndpointOptions.KeepReadBlockSize
  + i2c-spi-sniffer: added support for buffer overflow, optimized the SPI
    decoder, added support for SPI LSB-first-vs-MSB-first
  - i2c-spi-sniffer: fixed bitwise-arithmetic for building the SPI 16-bit word
  * i2c-spi-sniffer: switch order of bytes to: MOSI-HI, MISO-HI, MOSI-LO,
    MISO-LO
  + i2c-spi-sniffer: renamed I2cSniffer -> I2cSpiSniffer; added SPI decoder
  + i2c-sniffer: added 'Show STOP' property
  * i2c-sniffer: wait for OUT-transfers finished before closing the OUT-endpoint
  + i2c-sniffer: added 7-bit & 10-bit address decoding

  Ninja Scroll engine changelog:

  - njs_log: fix: first update cache, then notify widget parent
  - njs_log: don't reset sticky scroll files on cache rebuild
  + njs_log: added method: LogWidget::setStickyScroll
  * njs_log: only modify sticky-scroll flags when cursor is changed because of
    keyboard/mouse
  - njs_log: removed m_leafFoldableRecordCountLimit (seems like an excessive
    setting)
  + exposed access to m_leafLineCountLimit and m_cacheUpdateScrollRateLimit via
    njs::Server
  * changed m_cacheUpdateScrollRateLimit default to -1 (no delayed cache update
    -- each plugin must turn it on manually)
  * njs_log: inlined CacheMgr::processStickyScroll ()
  * njs_log: don't let any UI things to happen between releasing the index lock
    and requesting updates
  * njs_log: update line count on represent
  + njs_log: added delayed cache update (based on scroll-change rate limit)
  * njs_log: use the newly added methods axl::io::MappedFile::duplicate, setSize
  - njs_log: fix: SharedRecordFile::rename cleared m_auxFileList
  - njs_wdg: fix: TerminalWidget::escReset () incorrectly reset cursor pos to
    (0, 0)
  - njs_wdg: fix: csiSetScrollRgn didn't check begin/end for validity
  - njs_wdg: fix: csiSetMode/csiResetMode didn't check length of m_body before
    accessing m_body [0]
  - njs_wdg: fix: if zero size is passed in TerminalWidget::setConsoleSize,
    use defaults
  + njs_wdg: added TerminalWidget::isValidCursor
  - njs_wdg: fix: always delete history on set-scroll-region
  + axl_gui: added support for Ctrl+U (cut a line before the cursor)
  - axl_gui: fix: incorrect condition in WidgetScrollBar::isMaxed
  + njs_wdg: added TerminalScreenBuffer::isInsideScrollRegion
  + test_qt: added libfuzzer support, added xterm fuzz corpus

  Jancy changelog:

  - jnc_io_cmn: fix: invalid test in  AsyncIoDevice::isReadBufferValid and
    AsyncIoDevice::isWriteBufferValid
  - jnc_io: critical bugfix: incorrect handling of readBuffer/readOverflowBuffer
    when KeepReadBlockSize is in effect
  * axl_sl: CircularBuffer::setBufferSize should do a quick size
    check for a possible shortcut return
  - axl_sl: fix: inaccurate assert in CircularBuffer::setBufferSize
  - jnc_ct: critical bugfix: jnc_Type_getTypeString returned a dangling
    pointer
  * jnc_std:jnc_rtl: use sl::getAllocSize, not sl::getHiBit for allocation
    round-ups
  + jnc_std: added memmove
  + jnc_api: added jnc_Variant_isNull
  - jnc_rt: critical bugfix: GcHeap::stopTheWorld_l released the lock
    without changing state to something other than State_Idle, which
    effectively enabled threads running GcHeap::collect_l concurrently.
    the bug introduced when adding 'abort' functionality in the prev release.
  * jnc_io_base: use the newly added method axl::io::MappedFile::getFile ()
  + jnc_ct: added jnc_TypeKindFlag_ErrorCode to jnc_TypeKind_Enum
  + jnc_io_usb: added io.UsbEndpointEvent.WriteCompleted

................................................................................

version 3.9.1-a (2018-09-07)

  Service release

  Main application changelog:

  * nj_app: only use QPlainTextEdit::setPlaceholderText on QT >= 5.3; we use
    QT 5.0.2 on Linux as to increase the chances of the IO Ninja binary running
    on various Linux distros
  * nj_app: only apply packet template if packet templates are really used
    (otherwise, packet parse delay-finishes, and then we have min size limits
    even if packet template is off)
  - cmake: fix: added JANCY_JNCX_DIR to the import list when generating the API
    documentation

  Scripts changelog:

  - usb: removed the unused function getLineString ()
  * hw-serial-mon: moved getLineString to HwSerialMonLog.jnc
  + i2c-sniffer: initial commit (for internal testing)

  Jancy changelog:
  - jnc_ct: fix: decodeBinString should ignore \r and \n -- otherwise,
    multi-line binary literals don't work
  + cmake: added JANCY_JNCX_DIR to jancy_config.cmake

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

version 3.9.1 (2018-09-05)

  Major improvements:

  + Script transmit pane
  * Packet templates are now processed in the ioninja-server process
  + Added support for Modbus ASCII, Modbus TCP

  Main application changelog:

  * nj_app: remove min size limit when turning packet templates off with a tx
    pane
  + nj_app: use icons for use-packet-template/edit-packet-template buttons
  + nj_app: highlight the error line in script editor
  + nj_app: use default.jnc scripts whenever packet template or tx script is
    empty
  + nj_app: added placeholder text in file-transmit and text-tranmit pages
  + nj_app: added images: form, edit (used in packet template tx pane)
  + nj_app: added support for alternate radix in binary literals (0x, 0d, 0b,
    0o)
  + nj_app: added class ScriptEdit to serve as a Jancy editor for packet
    templates and script tx
  + nj_etx: added timetout to ScriptTransmitSrvPeer::abort (so we can just
    request abort without waiting)
  * nj_srv: abort tx script when tx gets disabled
  + nj_etx: added ScriptTransmitAppMsgCode_OnRunAborted to distinguish between
    user-induced abort and a legit Jancy exception
  * package: link msi actions to CRT statically (as to avoid the
    yet-not-installed msvcr/msvcp deps which might be missing on older Цindows)
  - nj_app: removed packet min size setting, properly update packet templates
    stuff (setting-page vs transmit-widget)
  + nj_etx: added two modes to PacketTemplateMgr (so setting page changes can
    be undone)
  - nj_srv: fix: keep DirectSource until module is compiled (otherwise, we gonna
    have dangling source pointers)
  + nj_srv: added idle event to script transmit srv peer (so we can wait until
    thread is done)
  * axl_sys_win: when calling FormatMessageW, try LANG_ENGLISH,
    SUBLANG_ENGLISH_US first; if failed, fall back to LANG_NEUTRAL,
    SUBLANG_NEUTRAL

  Scripts changelog:

  + ssh: added ssh-exec property (to specify the remote process to exec)
  + tdevmon: added KB links to the representation of capture error records
  * packets: updated the default packet template script
  - network-sniffer: removed the now defunct pcap write buffer stuff
  * tx: updated the default tx script and the arp who-is sample
  + api: added tx.jnc with a prototype for the transmit () function
  * tibbo-modbus: updated re the latest modbus code changes
  + modbus: major update: added support for Modbus-ASCII, Modbus-TCP
  + common: added hexEncoding.jnc
  + api: added methods: log.Writer.writeString, writeError, writeLastError
  * network-sniffer: renamed folder to NetworkSniffer
  + cypress-uploader: added FPGA status check retries

  Jancy changelog:

  + jnc_io_ssh: added advanced method SshChannel.connect which accepts
    SshConnectParams struct with extra options
  + jnc_std: added operators == and  != for std.Guid
  - jnc_io_pcap: removed the now unused property io.Pcap.m_writeBufferSize and
    io.PcapEvents.WriteBufferReady
  + jnc_io_pcap: implemented io.Pcap.write (was not functional)
  + jnc_ct: added support for non-space separators in binary literals (useful
    when defining IPs, MACs, etc)
  + jnc_api: added jnc_Runtime_isAborted
  * changed int -> bool_t wherever int is used as bool
  + jnc_rt: added GcHeap::isAborted and Runtime::isAborted
  - jnc_rt: APC prototype fix (caused compiler error on 32-bit windows)
  + jnc_rt: use SIGUSR1 to try and wake up waiting threads in GcHeap::abort
  - jnc_rt: fix: GcMutatorThread::m_waitRegionLevel should be volatile
  - jnc_io_base: properly handle read-only & write-only file-streams on POSIX
  - jnc_rt: fixed missing type specifier in GcHeap::resumeTheWorld
  + jnc_rt:jnc_api: added jnc_Runtime_abort ()
  * jnc_sys: make sys.sleep alertable on windows
  - jnc_ct: fix: don't set the newly created unit as the current unit
    (leads to problems when nest-parsing stdlib entities)
  * axl_io: io::Pcap::write should distinguish between retvals from pcap_inject
    (returns actual size on success) and pcap_sendpacket (returns 0 on success)


................................................................................

version 3.9.0 (2018-08-08)

  New major features:

  * Major logging engine update (now it's more responsive under high-load and
    with huge multi-gigabyte logs due to the fully parallel processing of
    indexing, representing, converting, searching, etc)
  + New plugins:
    + USB Control Endpoint (allows low-level communication with USB control
      endpoint #0)
    + TX Modifier (provides packet prefix/suffix, re-transmission,
      inter-character delays)
    + TX/RX Filter (allows switching TX/RX streams ON or OFF)
  + Serial baud rate combo-boxes are now editable (allows for arbitrary
    baud rate specification)
  + Hung server process detection and termination (now problems with the
    ioninja-server process should not affect the main GUI process)
  + Unicode temp paths are supported on Windows (previously, having a non-ASCII
    characters in TEMP would have resulted in the error: 'A device attached to
    the system is not functioning.')

  Main application changelog:

  * nj_app: improved handling of server crashes/hang-ups
  * nj_app: nagdlg layout update (didn't look too good on gnome)
  + nj_app: allow zero-length transmits (required by USB control transfers)
  - nj_gui: fix: ComboBox should set items value when it switches to editable
    mode
  - nj_app: fix: check for find-next/find-prev button state (in case invoked by
    shortcut)
  + conf: added TxModifier
  + nj_gui: allow adding child items to any property/information-item, not
    just groups (QTPB allows that)
  + nj_doc: added doc.Layer.m_isTransmitEnabled bindable const property - now
    layers may be notified when lower sessions enable/disable transmission
  + nj_app:nj_srv: added keep-alives (5 second timeout)
  - nj_srv: fix: restored registration of usb error provider
  - nj_app: fix: unmap index file on clear/rebuild
  * conf: re-factored plugin groups: now it's serial, network, file-systems,
    usb
  + nj_gui: added gui.ComboProperty.selectOption
  * nj_gui: made ComboBox.m_currentData read-write
  + nj_gui: added a separate binding for ComboBox.m_currentIndex
  * nj_app: rename default plugin groups ("other" for sessions, "generic" for
    layers)
  + nj_gui: added support for item values to gui.ComboProperty
    (EnumOption.m_value is used as actual value)
  - nj_gui: removed gui.ComboBox.m_isDualText property -- now every editable
    combo box behaves like this (item text - description, item data - value)
  - nj_app: fix: merge kind combo did not enable/disable merge threshold
    spinbox
  + nj_gui, nj_app: added new gui class: gui.ComboProperty
  + nj_srv: added self-pipe trick on POSIX. Apparently, closing STDIN does not
    terminate the ongoing 'read' (at least, not on Linux)
  + nj_app: added FileFlag_DeleteOnClose to plugin-settings and log-settings
    files
  - njs_app: fixed find-incremental/find-next/find-prev logic
  + nj_app, nj_srv: implemented clear-log/rebuild-log
  + nj_srv: use stdin to monitor state of the parent process
  + nj_app: use QShortcut for F3/Shift+F3 in the Find Dialog
    this way, there is no forced delay in between activations of the shortcut
  + nj_app, nj_srv: use the newly added io::FileFlag_Unlink, io::AutoDeleteFile,
    io::psx::AutoUnlinkSharedMemory
  * nj_app, nj_srv: use mapping name instead of file name for index lock

  Scripts changelog:

  * usb: split the usb endpoint plugin into two: usb data endpoint
    and usb plugin endpoint (completely different ui and io code)
  + common: added parseInteger.jnc
  * tx-modifier: removed groups (made use of the newly added ability to
    add children to any property)
  + tx-rx-filter: added setting persistency
  * serial: added SerialLogRecordCode.ControlLineChanged -- now control line
    changes can be encoded symmetrically with status line changes.
  - serial: removed inter-char delays -- now this funcionality is available
    via the TX Modifier layer
  + tx-modifier: initial commit of TX Modifier layer
  + common: added new file: escapeEncoding.jnc
  + tx-rx-filter: initial commit of TX/RX filter layer
  - wizards: fix: invalid signature for log.Filter.filter ()
  + api.gui: allow adding child items to any property/information-item, not
    just groups (qtpb allows that)
  + api.doc: added doc.Layer.m_isTransmitEnabled
  * conf: updated plugin grouping
  - serial-mon: fix: don't update port name while capturing
  - hw-serial-mon: fixed path to UsbLog.jnc
  * serial: all the serial plugins are finalized (use common ui, allow editing
    baud-rate, updated re api change in io.Serial.setupDevice)
  - common: bugfix: io.SerialSettingUi should check for presence
    of properties before accessing them
  - serial-tap: fixed serial setting configuration (was broken after moving the
    code to SerialSettingUi)
  * serial: don't try to set baud rate if it's the same
  * serial, serial-tap, ez-tap-pro, generic-serial-tap: extracted common setting
    code and shared it via io_SerialUi.jnc
  * all: redesign plugin grouping (now it's serial/network/file-systems/usb)
  + gui: gui.ComboBox.m_currentIndex now has a separate non-shared binding
  + added gui.ComboProperty.selectOption
  + added a convenient overload for gui.Toolbar.addComboBox
  * samples: removed hw-serial-mon and spi-tap from plugin folder
    and added those as samples
  + serial: make baud-rate editable (initial commit)
  - gui: removed m_isDualItemText
  * serial: use the newly added gui.ComboProperty for port name and baud rate
  + api: added new class: gui.ComboProperty
  * regex: log thread is no more; use suspend/resume instead
  - std: minor locking fix
  - ssh: fix: import "io_File.jnc" was missing
  - xmodem: fix: io.File.m_size is now read-only; use setSize instead
  - serial, udp: fixed signature for: log.Filter.filter

  Ninja Scroll engine changelog:

  - njs_log: fix: conversion mgr was unfunctional (never tested)
  - njs_log: a few int64/int32 fixes (relevant for 32-bit platforms)
  - njs_log: fix: invalid offset for save-log-as-text
  + njs_log: make bom configurable
  + njs_log: added support for bin-text lines in save-log-as-text
  - njs_log: typo fix: invalid caret pos returned by
    CachePage::getCaretPosFromLogPos
  - njs_log: fix: unbalanced lock calls on hidden records
  - njs_log: fix: don’t use setMouseCapture/releaseMouseCapture
  - njs_log: fix: bool function returning NULL
  - njs_log: fix: index file accessors MUST HAVE multiple dynamic views
    (otherwise walking the tree could cause page faults)
  * njs_log: set cursor to the *end* of selection upon successful
    find (more traditional approach)
  * njs_log: update "is-incremental-find" logic -- accept size
    decrement also (as long it's not empty)
  - njs_log: fixed wrapping in range processors
  + njs_log: added IndexFile::getZoneCount
  * njs_log: changed LogPos to only contain absolute zone-idx and zone-offset
  * njs_log: validate caret pos and redraw widget on log-clear
  - njs_log: fix: false-positive cache-miss in LogWidgeT::paintLineRange
  - njs_log: fix: suspension logic in RangeProcessor/ConversionMgr
  * njs_log: minor optimization of redrawing in
    CacheMgr::onRepresentPageCompleted
  * njs_log: use the newly added io::FileFlag_Unlink (dropped the old
    ifdef-ed code)
  - njs_log: critical fix: in CacheMgr::onRepresentPageCompleted
    it's NOT OK to touch 'page' pointer after scrolling or redrawing line
    ranges -- it might unload the page due to the cache size limit
  * njs_log: moved OnFoldRecordCompleted notification to IndexMgr
  - njs_log: fix: IndexMgr updated a leaf using m_recordIdx instead of
    m_recordCount
  - njs_log: fix: ConversionMgr has unbalanced suspend/resume inside stop ()
  * njs_log: create a dedicated cleanup thread in  RangeProcessorMgr
  - njs_log: fix: cache one extra record per page if the leaf is merged forward
  + njs_log*: the first working prototype of the new design

  QT Property Browser changelog:

  - qtpb: fix: invalid signal/slot names in
    QtComboEditorFactory::disconnectPropertyManager
  - qtpb: fix: clang failed to compile a double-right chevron in a template use
  * qtpb: check for unchanged value in
    QtComboEditorFactoryPrivate::slotPropertyChanged
  * qtpb: QtComboProperty now can use item data as actual text values (e.g.
    item text - device description, item data - device name)
  - qtpb: minor fixes in the newly added QtComboProperty... classes
  + qtpb: added QtComboProperty/QtComboPropertyManager/QtComboEditorFactory

  Jancy changelog:

  - jnc_io_usb: fix: UsbDevice::close should nullify m_asyncControlEndpoint
  - jnc_io_usb: fix: typo in UsbAsyncControlEndpoint::UsbAsyncControlEndpoint
  * jnc_io_usb: renamed requestId -> requestCode (for consistency)
  + jnc_io_usb: added support for asynchronous control transfers
    (initial commit, work-in-progress)
  + jnc_std: added std.Array.detach () / std.Buffer.detach ()
  - app: fixed main() error code on cmd-line parse error
  - cmake: changed language of jnc_dll to CXX (otherwise,
    -static-libstdc++ doesn't apply, which results in libstdc++.so dependency)
  * jnc_io_base: changed the order of values in io.Serial.setupDevice and added
    default values

................................................................................

version 3.8.7 (2018-06-05)

  introduces: Tibbo Serial Tap plugin, shared library jancy-1.8

  Main application changelog:

  - nj_app: fix: check whether a layer has already been added (disallow adding
    duplicate layers)
  + inf: added .inf files and a script for .cat file generation and signing
  * sh: 7z archives are built using cpack instead of bat files
  + conf: added serial and spi tap plugins to plugins.conf
  * cmake: redesign packaging on Mac OSX
  - nj_app: removed explicit qt library path modification (better use qt.conf)
  * drivers: updated driver package to include the winusb co-installer (so it
    works on machine with no winusb)
  * cpack: use top-level-directory with archive generators
  + conf: added new filter wizard to wizards.conf
  - njs_srv: don't link to libusb and register usb error provider anymore
    since we've changed to dynamic linking to jancy.dll, it must be done there
  + nj_log: report Rx parts of TxRx to the app (so terminal can be used with
    dual-hex-view)
  + nj_log: fix: Log.suspend and Log.resume were not mapped
  + nj_log: added support for retro-colorization flags (aux flag for
    specifying the part of dual-hex-view)
  * nj_app, nj_srv: update conf dir detection (include ../etc/ioninja)
  - don't display crash-report-dlg if crash dir is empty
  + cpack: packaging for TXZ, DEB, RPM implemented
  * package: wix packaged updated to auto-install winusb drivers using
    dpinst.exe
  * inf: renamed dirs: inf -> drivers (more windows-traditional, even though
    there are no actual drivers)
  + nj_app, nj_srv: setup error router
  + register parse error provider; previously, we only linked jancy libs
    statically, so it wasn't necessary

  Scripts changelog:

  + regex-colorizer: added support for dual-hex view (e.g. SPI Tap)
  + common: throughput calc now processes log.StrRecordCode.TxRx
  + api: added RetroColorizeFlags.Aux (to specify which part to apply
    colorization to)
  - serial-tap: check for non-null mask before reporting status-line
    changes
  * serial-tap, spi-tap: removed usb.ids files and instead hardcode
    device ids into the script (not going to add more ids anyway)
  + spi-tap: initial commit
  - ez-tap-pro: fix: use m_highSpeed for anything above 115200 bps

  Ninja Scroll engine changelog:

  + njs_log: improved support for dual-hex-view: misc copy modes
    implemented, retro-colorization now has a aux-flag (to specify the which
    part to apply colorization to)
  - cmake: minor fix: using QT modules should happen BEFORE axl_set_pch
  - njs_log: fixed uint64_t <-> size_t warnings on x86

  Jancy changelog:

  * cmake: build with install rpath
  - jnc_api, jnc_dll: (temp solution) link to libusb and register usb
    error provider
  - jnc_rtl: fix: jnc.RegexDfa unconditionally set m_isIncremental in
    jnc.RegexState (probably, a brainfart)
  - jnc_rtl: fix: jnc.RegeDfa finalize did not update group counts in accept
    contexts
  - jnc_rt: fix: prevent longjmp unwinding on win64
  + jnc_app: setup error forwarding and register parse error provider
  - jnc_ext: removed propagateLastError (now irrelevant); setup error
    forwarding in *.jncx
  + jnc_api: implemented jnc_setErrorRouter
  * jnc_api: moved jnc_DynamicExtensionLibHost.h to the 'include'
    folder
  + jnc_api: added explicit definition of jnc_Error (maps to axl::err::ErrorHdr)
  * cpack: inverted the os-version order in the file name of a package
    (must be version-first)
  * cmake: workaround for SOVERSION on windows (jnc_dll)
  + added VERSION/SOVERSION properties to jnc_dll
  * cmake: renamed jnc_api_static -> jnc_core and jnc_api_dynamic ->
    jnc_api_ext
  * changed JNCX dir from JANCY_BIN_DIR to JANCY_DLL_DIR (not the same on unix)
  * cmake: link all the executables to the jancy dll (if it's being built)
  + jnc_ext: added object libraries for jnc_rtl, jnc_std, jnc_sys
  + jnc_api: export api functions when building cmake object library
  + jnc_dll: build dynamic library jancy-x.x.dll
  - jnc_api: fixed a few missing JNC_EXTERN_C declarations

  AXL changelog:

  * axl_sys: updates in sys::ReadWriteLock re named sems on posix
  + axl_err: added support for error forwarding
  * cpack: inverted the os-version order in the file name of a package
    (must be version-first)
  - cmake: removed rpath direct modification via linker options (should
    be done via CMAKE_INSTALL_RPATH in actual projects)
  * cmake: switch to dynamic link (/MD /MDd) by default
  - axl_sl: minor fix: sl::BoxIterator::r () -- better reference
    m_value directly (rather than as: *p())

................................................................................

version 3.8.6 (2018-04-26)

  introduces: new EZ-Tap Pro plugin

  Main application changelog:

  * nj_gui: added property: gui.InformationValue.m_valueColor
  * nj_gui: added property: gui.ComboBox.m_isDualItemText
    this allows having an editable combo box with descriptive items in the
    drop-down (e.g. editable port names, device descriptions in the drop-down)
  * nj_app: emit cursor-pos changes and index-file changes once a second
    this changes renders the timer in InformationWidget irrelevant

  Scripts changelog:

  + plugins: added new plugin: EZ-Tap Pro (initial commit)
  + generic-serial-tap: new command: flip DTE/DCE
  + tibbo-serial-tap: new command: flip DTE/DCE
  - serial: fix: removed trailing \n from the port-opened log message
  * plugins: updated HwSerialMon for Cypress EZ-USB FX3 -- we are
    ditching FT601x (good riddance)
  + plugins: use the new prop gui.ComboBox.m_isDualItemText in serial
    and serial mon plugins
  - plugins: removed DCD line info
  + plugins: added new plugin: Tibbo Serial Tap Cable
  * plugins: renames: SerialTapCable -> GenericSerialTapCable,
    ModbusGatewayMon ->TibboModbusGatewayMon
  + api: added properties: gui.ComboBox.m_isDualItemText,
    gui.InformationValue.m_valueColor
  - udp: fix: apply socket and buffer properties to the socket
  + common: added new socket property: udp broadcast
  * common: renamed"local/remote TCP port" -> "local/remote port" -- these
    are used for UDP, as well
  * moved all scripts to a dedicated repo; public mirror at:
    https://github.com/vovkos/ioninja-scripts

  Jancy changelog:

  + jnc_io_usb: added support for control transfers (io.Device.controlTransfer)
  - jnc_io_usb: fix: invalid location for clearing active events (lock
    was released after that) -- may have caused events to be never noticed
  - jnc_io: fix: apply SocketOption_UdpBroadcast and enforce
    AsyncIoOption_KeepReadBlockSize | AsyncIoOption_KeepWriteBlockSize for
    datagram sockets in SocketBase::setOptions

  QT Property Browser changelog:

  + qtpb: added support for value color (QtProperty::valueColor/setValueColor)

  AXL changelog:

  + axl_sl, axl_ref, axl_err: use rvalue refs in all ref-count-buffer-based
    classes
  + axl_g: added simple detection of rvalue-ref support in C++ compiler
  * axl_ref: moved ref::RefCount functions to .h; replaced size_t ->
    int32_t and removed bitfields -- for a minor performance improvement
  * axl_sys: use intrinsics for interlocked ops on windows
  + axl_sl: added branchless algo from hacker's delight for hi-bit/lo-bit
  + axl_io: added support for async control transfers -- for completeness

................................................................................

version 3.8.5 (2018-04-09)

  introduces: server-side log processors in the Ninja Scroll enging, dramatic
  performance increase in find-in-log and save-log-as-text for large (multi-GB)
  logs, new information pane, throughput calculator, checksum calculator,
  new Tibbo Modbus Gateway Monitor plugin.

  Main application changelog:

  + nj_app: added calc-progress-bar in information widget (unified with
    rebuild-progress-bar)
    also, added nice thousand-separated formatting for large integers
  - nj_srv: fix: cancel all active range processors during shut down (definitely
    before shutting down plugin runtimes)
  * nj_app: alleviated evaluation restrictions on Crash Report dialog (can
    skip sending, aka "not now")
  * nj_app: don't update information widget unless it's visible
  + nj_app: added a new erasor icon
  * nj_srv: add udev dependency (needed when linking to libusb statically)
  - nj_app: fix: save transmit pane during session switching
  - nj_gui: fix: all information values should be read-only
  - nj_log: remove RangeProcessor::startRecord; instead, set timestamps and
    record codes in RangeProcesor::processXxx. this allows for more precise
    timestamp-based calculations
  + nj_gui: added property: gui.EnumProperty.m_currentText
  * nj_app: reduce flickering in the information widget by delaying the
    disable of selection-dependent items don't show "updating..." until the next
    update cycle -- chances are, range processor will finish before then
  + nj_app: added command: select all
  + nj_app, nj_srv: added support for selection processors
  + nj_app: added information pane
  * nj_gui: updated StringPropertyAppPeer for the new qtpropertybrowser
  + nj_app: added 'delete all' button to crash report dialog
  + nj_app: new save-log-as-text using range processors (rather than cache
    processors)
  * nj_app: minor ui fixes in find dlg
  + nj_app: replaced cache find (client-side) with range find (server-side)
  + nj_app, nj_srv: added SrvMsgCode_ProcessHyperlink

  Scripts changelog:

  - scripts: removed Hardware Serial Monitor (to reduce confusion)
  * scripts: renamed files: ModBus -> Modbus
  + scripts: added Tibbo Modbus Gateway Monitor plugin
  * scripts: usb endpoint should use max-packet-size as read-block-size
    this way, the responsiveness is better (this plugin is a usb endpoint
    terminal, after all)
  - scripts: fix: properties of io.UsbEndpoint were not updated properly
  + scripts: added momentary tx/rx throughput calc
  * scripts: use thousand-separated format for all sizes
  + scripts: sniffer: added ARP/INARP support to the Network Sniffer plugin
  + scripts: file stream: added message: "file cleared"
  * scripts: file stream: read all the buffered data on eof
  + scripts: added standard information values to all the plugins
  * scripts: refactor: trhoughput calculator, checksum calculator, std session
    info
  + scripts: added simple checksums (sum8, sum16-le, sum16-be)
  + scripts: added session timer
  * scripts: re-factored/updated checksum information set
  + scripts: added utility function for ip4 checksum incremental calculation
  - scripts: fixed name: should be crc16_ccitt, not "ccit"
  - scripts: io.Pcap.m_snapshotSize is read-only (remnants from the previous
    version of jancy)
  - scripts: fix: a bug in modbus exception processing
  + scripts: added crc32.jnc
  + scripts: selection processors & related infos are extracted into common
    files

  Ninja Scroll engine changelog:

  - njs_log: critical bugfix: mini-index file was not cleared on reset
  + njs_log: added sync method Server::cancelAllRangeProcessors
  - njs_log: typo fix: if the end page is not cached, range process
    must be postponed; but it was added to the start page, not the end page
    as it should
  - njs_log: fix: incorrect calculation of njs::LogPos on merged page borders
    (the last line of a merged page contanis records from two leaves)
  * njs_wdg: keep selection on tab keypress
  - njs_log: fix: new zone should only processed when we are in range
  - njs_log: fix: LogWidget::isBinSelection () was incorrect (just used the
    cursor position)
  + njs_log: added LogWidget::selectAll () method
  * njs_log: only call onCursorPosChanged when the pos actually changes
  - njs_wdg: fix: copy from terminal stopped upon the very first empty
    line
  + njs_log: added field: RangeProcessor.m_zoneOffset
  * njs_log: rename RangeProcessor::processDualBinHex -> processDualBin
  + njs_log: added StdRangeProcessorId_Last constant
  + njs_log: added NotifyCode_IndexFileChanged
    changed logic in getLogPos (need to handle selection start differently)
  + njs_log: export informational functions from IndexFile/CacheMgr
  + njs_log: added save bin as file & save log as text range processors
  - njs_log: fix offset issue in TextFindRangeProcessor set caret to the
    beginning of selection -- otherwise, using keyboard after find produces
    unexpected log jumps
  - njs_log: fix: RangeFind should use 0 as an indicator for invalid
    processId, not -1
  * njs_log: refactor UI update limitation code
  + njs_wdg: add a flag CursorFlag_KeepSelection to keep selection when
    setting caret
  - njs_log: fix: adjust record count in mini-index leaves
  * njs_wdg: LineWidget::getSelection should return caret pos if actual
    selection is empty
  - njs_log: fix: when wrapping, also update leaf zone idx and zone offset
    -- otherwise, isFinished may return false-positive
  * njs_log: check for failed processRange (processId == 0)
  + njs_log: added RangeFind::getProcessId accessor
  + njs_log: populate mini index file in log server
  - njs_log: fix: incorrect calculation of m_zoneOffset in
    CountingRepresenterTarget
  * njs_log: zone indexing re-design
  + njs_log: TextFindRangeProcessor/BinaryFindRangeProcessor prototypes
    are functional
  + njs_log: added server-side RangeProcessor-s

  Jancy changelog:

  + jnc_io_usb: support out-of-order completion of usb transfers
  - jnc_io: removed incorrect assert (!m_readBuffer.isFull ()) in
    AsyncIoDevice::bufferedReadImpl_l
  + jnc_io_usb: added property UsbEndpoint::m_readTimeout
  - jnc_io_usb: fix: incorrect context for USB transfers
  - jnc_io_usb: fix: Endpoint::m_isOpen was not properly initialized
  - jnc_io_usb: fix: usb transfer was not properly allocated prior to
    fill & submit
  - jnc_ct: fix: bigendian enums were not handled properly
  + cmake: add crypto & udev dependencies (needed during static link to
    libusb & libssh2)
  - cmake: don't use axl_set_export_version_scrtipt on mac, where the
    --version-script option is not supported
  * jnc_io: advance disk file position on windows (overlapped IO requires
    explicit offsets)
  + jnc_sys: added sys.formatTimestamp () functions
  - jnc_ext: fixes re the latest change in axl::sl::HandleTable
  - jnc_ct: fix: data/class ptr type tuple had incorrect handling of
    readonly pointers
  - jnc_io: fix: process 0-lengthed return in FileStream as EOF indicator
  - jnc_io: minor fix: incorrect logic in AsyncIoDevice::setEvents_l
  - jnc_io: fix: AsyncIoDevice::m_readOverflowBuffer was not cleared on
    open; this could leave to inconsisten buffer state when a device is
    closed during intense IO and then re-opened
  - jnc_std: remove readonly modifier from fields of struct std.Error
  - jnc_io: critical bugfix: lock inside markOpaqueGcRoots
  - jnc_ext: fixes re the latest change in axl::sl::HandleTable
  - jnc_ct: fix: data/class ptr type tuple had incorrect handling of
    readonly pointers
  - jnc_io_base: fix: interpret 0-lengthed serial read on POSIX as EPIPE
    (broken pipe)
  - jnc_ext: fixes re the latest change in axl::sl::HandleTable
  - jnc_ct: fix: data/class ptr type tuple had incorrect handling of
    readonly pointers

  QT Property Browser changelog:

  + qtpb: added QtProperty::valueToolTip and disabledValueText
    properties
  - qtpb: fixed displayMode (must be part of StringPropertyManager)
  + qtpb: added StringPropertyManager::isReadOnly/setReadOnly property
  + qtpb: added QtTreePropertyBrowser::resizeNameColumnToContents method

  AXL changelog:

  - axl_cmake: removed GCC_LINK_FLAG_EXPORTLESS_EXE on mac -- ld here doesn't
    support --version-script
  + axl_gui: added QT_NO_VERSION_TAGGING
  * axl_gui: don't check if caret was visible before, force caret update
  - axl_enc: fix: UTF-8 -> UTF-32 -> UTF-8 should yield the same length
  - axl_sl: critical bug fix: TextBoyerMooreFind::find should use length,
    not size
  - axl_sl: fix: reverse boyer moore accessor save tail incorrectly
  * axl_sl: minor update in sl::String: s2 & s3 should return sl::String,
    not sl::StringRef
  + axl_gui: added convenient constructors to class HyperText
  - axl_sl: gcc-related fixes in sl::HandleTable
  * axl_sl: refactor: sl::HandleTable is now uniform with the other maps

................................................................................

version 3.8.4-a (2018-02-29)

  * axl_cmake: gcc: export NOTHING from executables and JUST the specified
    symbols -- from shared libs to improve portability across various Linux
    distros
  - jnc_ct: typo fix: ExtensionLibMgr reported a wrong error if dynamic
    extension could not be loaded

................................................................................

version 3.8.4 (2018-01-26)

  introduces: new Serial Tap Cable plugin, new streaming mode in Tibbo Device
  Monitor, all Tibbo Device Monitor-based plugins use generic class
  io.DeviceMonitor and do IOCTL decoding in Jancy scripts, detection of
  buggy serial drivers on Windows with fall-back to conservative settings, a
  few critical bug fixes in the Ninja Scroll logging engine.

  Main application changelog:

  + nj_app: add a break between main and session toolbars (this way they
    initially are displayed on two separate lines, rather than being next to
    each other on a single line)
  - nj_srv: fix: relative timestamps (compile times) should use time-zone #0
  + nj_log: added log.StdRecordCode.Alert (as a more severe warning on pastel
    orange background)
  * nj_app: set GC guard page as the default everywhere; previously, the default
    for windows x64 was gc-simple-call
  - nj_app: workaround: avoid calling QIcon::availableSizes ()
    currently, we use static linking to CRT, it means QT dlls use a different
    memory allocator than the main EXE module; returning templated classes
    (QList <QSize> in this particular case) under these conditions is not safe
  * cmake: added libusb as optional dependency
  * package: removed nj_io_mon.jncx from all the packages (io_devmon.jncx will
    be pacakges with all the other jancy extensions)

  Scripts changelog:

  - scripts: restore defaults button should not reset port name(s)
  - scripts: use 'try' in 'gui.ComboBox.m_onEnter' handlers so that a possible
    exception is not added to the log.
  * scripts: minor update to the serial log port open message (for consistency)
  * scripts: make RxBufferFull message optional (and OFF by default)
  * scripts: rename: ReceiveBufferFull -> ReadBufferFull, TransmitBufferReady
    -> WriteBufferReady
  + scripts: new plugin: serial tap cable session
  * scripts: minor re-factoring in Serial plugin
    (adjustSerialSettingsForBuggyDrivers -> detectSerialBuggyDriver +
    setConservativeSerialSettings) this way, it's more convenient to apply to a
    dual-serial port sessions such as Serial Tap-Cable
  - scripts: typo fix in Mailslot session: m_syncId is now a member of
    MailslotSession, not io.Mailslot
  - scripts: removed ring status line change detection (it's not shown in
    log/status-bar anyway)
  + scripts: SerialMon for Linux: implemented termios IOCTL parsing
  * scripts: renamed io.SerialFlowControl.XOnXOff ->
    io.SerialFlowControl.XonXoff (for consistency)
  + scripts: added workaround for buggy drivers such as the one from Prolific
  * scripts: rename: log.StdRecordCode.RxBufferFulllLossless ->
    log.StdRecordCode.RxBuffeFull
  * scripts: moved SerialReadMode to SerialLog.jnc (otherwise, serial monitor
    fails to compile)
  + scripts: added overridable method: io.Monitor.processError
    normally, we also want to close the active connection whenever an error
    occurs; it has to be done from within the main session class
  * scripts: changed the order of PID/file ID in monitor sessions
  + scripts: serial: added more info to port-open log record; merged two props
    (wait-first-char & check-comstat) into one (read-mode); write read-mode and
    read-interval changes to the log
  * scripts: serial: use io.Serial.setupDevice for applying all the settings at
    once and avoiding multiple SetCommState/tcsetattr calls
  + scripts: serial: added DTR/RTS properties so it's possible to fully control
    the serial port from the setting property page
  * scripts: serial: disable RTS button/property when RTS/CTS is on.
  * scripts: ported all the remaining plugins to the new Jancy IO model
  + scripts: create a dedicated class io.Monitor --  it reads from tdevmon in
    stream mode, accumulates notification package andthen calls the overridable
    handler

  Ninja Scroll engine changelog:

  - njs_log: criticial fix: don't update CachePage::m_indexLeaf inside
    updateIndexTailLeaf unless we have successfully applied the part buffer
    (could cause occasional and hard-to-catch crashes)
  - njs_log: there is no need to check page for null (getPageByIndexLeaf always
    returns a non-null page ptr)
  * njs_log: make updateTailLeaf return IndexLeaf* and also assert on
    growing record count/size
  - njs_log: critical bugfix: don't unconditionally nullify the current
    line during fold
  + njs_log: added overload ServerPeer::writeRecord (const char*)

  Device Monitor changelog:

  - dm_app: fix: properly configure monitor on linux (including the final
    enable call)
  + dm_app: added the file name wildcard cmd-line switch on linux
  - dm_win_lib: fix: reading blobs was inefficient (was starting with 0 bytes
    -- have to start with something reasonable, e.g. 256)
  - dm_app: fix: monitor was not initially enabled (it was working due to a bug
    in the driver -- enable counter was ignored)
  * dm_app: minor update in output format for file name wildcard
  * dm_app: updates re the latest kernel-module api changes
  - dm_win_sys_core: critical bugfix: removed the leftover KeAcquireSpinLock
    inside loop in Connection_p_notifyMessage_l
  + all-drivers: added a debug suffix to all description strings
  - dm_win_sys_core: fix: partial notifications had incorrect
    PendingNotify.m_size field; this resulted in garbaged stream and likely
    an invalid-signature error
  * dm_win_sys_core: major update: re-write cancellation race protection and
    prevent notification order races
  + dm_win: added a dedicated code dm_NotifyCode_DataDropped for data dropped
    notifications
  * dm_win_sys_core: removed const modifier from MemBlock* paramBlockArray
    this is necessary for copyScatterGatherPartial (in streaming mode)
  + dm_win_sys_cmn: added copyScatterGatherPartial for copying scatter-gather
    into multiple buffers
  - dm_win_sys_core: fix: check for m_enableCount before notification
  - dm_win_sys: bugfix: DM_IOCTL_SET_FILE_NAME_FILTER should check in buffer
    size, not out buffer size
  * dm_win_sys: style: use upper-case for types (DDK/WDK-style)
  - dm_win_sys_core: fixed warning re UINT -> USHORT conversion
  + whdc: added test-sign script for testing the drivers under win10
  + dm_win_sys: dm_win_lib: added streaming mode (message mode is still
    available as an option)
  * dm_win_sys: changed API a bit -- now pending notify limit and file name
    filter could be set after connection to a device is established (so it's
    possible to adjust it on-the-fly)
  - dm_lnx_lkm: removed redundant trailing '...' from printk's
  * dm_lnx_lkm: switched the order of fields in dm_IoctlDesc (to make it more
    convenient to use curly initializers) the old API (via Connect_v0302xx) is
    still available -- the order of fields is adjusted dynamically
  + dm_lnx_lkm: added debug printk's on setting the IOCTL desc table
  + dm_lnx_lkm: added support for FIONREAD
  + dm_lnx_lkm: ported the new streaming notification model (with partial
    scatter-gather and postponed read completion) to LKM
  + dm_lnx_lkm: added dm_NotifyCode_DataDropped
  + dm_lnx_lkm: added function: copyScatterGatherPartial
  - dm_lnx_lkm: fix: IOCTL argument should not be size_t; use uint32_t instead
  + dm_lnx_lkm: streaming mode (message mode is still available as an option)
  + dm_lnx_lkm: added a bunch of IOCTL codes for post-connect configuration
  + dm_lnx_lkm: added support for file-name filtering (so it's possible to hook
    a driver and then receive notifications for all the device it's serving)

  Jancy changelog:

  - jnc_io_base: fix: in io::FileStream::open PIPE_READMODE_MESSAGE is only
    applicable to named pipes (when GetFileType returns FILE_TYPE_PIPE)
  - jnc_io_base: bugfix: length of \\.\pipe\ and \\.\mailslot\ prefixes was
    calculated incorrectly
  - jnc_io_base: bugfix: don't read in io.FileStream if it was opened with
    io.FileFlags.WriteOnly
  + jnc_io_base: ensure \\.\pipe\ prefix in io.NamedPipe.open
  - jnc_io_xxx: critical bugfix: all the newly ported IO classes had null
    markOpaqueGcRoots (instead, should call AsyncIoDevice::markOpaqueGcRoots)
  + jnc_ct: added utf8_t, utf16_t, utf32_t to jnc_StdTypedefs.jnc (for stdlib
    doc generation)
  - cmake: fix: -D_JNC_DYNAMIC_EXTENSION_LIB must be added prior to axl_set_pch
  * jnc_io_xxx: rename: ReceiveBufferFull -> ReadBufferFull,
    TransmitBufferReady -> WriteBufferReady
  - jnc_ct: critical bugfix: octal constant tokens were converted to numbers
    using the decimal radix
  - jnc_io_devmon: don't check getIncomingDataSize (not really necessary)
  - jnc_io_base: don't check getIncomingDataSize (not really necessary)
  * jnc_ct: when searching in namespaces, don't go to parent namespaces of
    base types
  * jnc_io_base: rename XOnXOff -> XonXoff (for consistency)
  - jnc_ct: fix: use module global symbol map (m_functionMap) for maping global
    variables on llvm versions < 4.0.0
  * jnc_ct: use '?' prefix for global variables (just like we do for functions)
  * jnc_ct: changed the implementation of Module::mapVariable
  - jnc_io_devmon: POSIX fix: m_ioThreadEvent.wait () -> sleepIoThread ()
  - jnc_sys: typo fix: incorrect flag assignments in sys.SystemInfo
  - jnc_sys: fix: OsFlag's had wrong values
  - jnc_io_usb: POSIX compilation fix: include "axl_io_psx_Pipe.h" was
    missing
  - jnc_io_pcap: POSIX compilation fix: m_ioThreadEvent.wait () ->
    sleepIoThread ()
  - jnc_io_base: POSIX compilation fix: createIncomingConnection () ->
    m_incomingConnectionPool.get ()
  + jnc_std: added functions: strncmp, strnicmp, strneq, strnieq,
    strichr, stristr
  + jnc_io_base: added function: io.getSymbolicLinkTarget
  - jnc_io_base, jnc_io_usb, jnc_io_pcap: removed unnecessary declarations of
    the now-missing event params
  - jnc_io_base: fix: removed the now-missing Mailslot.m_syncId field
  - jnc_io_devmon: fix: m_overlappedIo was not allocated/freed
  + jnc_std: added property: std.StringBuilder.m_sz (which is always
    non-null and zero-terminated)
  + jnc_io_base: added method: io.File.flush ()
  + jnc_io_base: added io.Serial.setupDevice for setting all the
    setting with one call
  * jnc_io_base: replace ^ with != (reads cleaner)
  * jnc_sys: changed sys.g_systemInfo to a variable (instead of a property) and
    map it directly
  + jnc_ct: added a pragma-todo-warning re retval coercion on MSC 32-bit
  + jnc_api, jnc_ct: added support for mapping global variables
  - jnc_io_usb: fixed warning re singed-unsigned-comparison
  + jnc_api: added NOMINMAX definition under windows
  * jnc_io_ssh: use AsyncIoDevice::setSetting for changing read block
    size
  * jnc_io_usb: ported io.UsbEndpoint to the new IO architecture
  * jnc_io_pcap: ported io.Pcap to the new IO architecture
  * jnc_io_base: ported io.NamedPipe, io.Mailslot, io.FileStream to the new
    IO architecture
  * jnc_io_base: io.SocketAddressResolver now uses completion routine
    arg rather than event field
  * jnc_io_devmon: moved all overlapped-related fields in io::DeviceMonitor
    to struct OverlappedIo
  * jnc_io_base: moved all overlapped-related fields in io::Socket & io::Serial
    to struct OverlappedIo
  * jnc_io_cmn: removed overlapped read list & overlapped write block
    from the base class AsyncIoDevice
  + jnc_io: added tdemon-based device monitoring extensions library
    io_devmon.jncx
  - jnc_rt: bugfix: class field boxes of base types were not added during
    allocation
  + jnc_std: added standard error guids: errno, winerror, ntstatus
  + jnc_std: added overloads in std.StringBuilder for dealing with UTF-16 &
    UTF-32
  - jnc_io: bugfix: AsyncIoEvent_ReceiveBufferFull was not cleared in
    AsyncIoDevice::bufferedRead
  - jnc_ct: fix: choosing overloads could end prematurely (incorrectly reporting
    ambiguous call)
  - jnc_ct: fix: when up-casting class pointers, don't check safe pointers for
    null
  + jnc_ct: added standard typedefs: utf8_t, utf16_t, utf32_t
  * jnc_api: move warning suppressions to a dedicated file (no pragma once)
  + doc: added --ignore-import io_base.jncx cmdline switch in stdlib
    documentation
  + jnc_app: added a command line option for adding ignored imports
  + jnc_ct, jnc_api: added ignored import set
  - jnc_ct: removed the unneeded file path string cache

  AXL changelog:

  * axl_io_win: when enumerating serial ports, use SPDRP_FRIENDLYNAME first,
    then SPDRP_DEVICEDESC as a fallback (SPDRP_FRIENDLYNAME yields a
    description just like in the Device Manager)
  - axl_io: typo fix: SerialSettings constructor didn't propagate dtr & rts
    values
  + axl_g: added macros _strnicmp/_wcsnicmp on POSIX (mapping to
    strncasecmp/wcsncasecmp)
  + axl_io: implemented getSymbolicLinkTarget for POSIX (via readlink)
  - axl_io: fixed missing 'const' qualifier in
    SharedMemoryTransportBase::initializeMapping ()
  + axl_io: added io::getSymbolicLinkTarget (implemented on windows via
    NtQuerySymbolicLinkObject)
  + axl_core: added axl_sys_win_NtDll.h/cpp to store native NT declarations
  * axl_io: on windows, setting all serial settings via DCB affects DTR & RTS;
    therefore, we must include it in io::SerialSettings and update it
    whenever we modify flow control
  * axl_io_win: enumerate serial ports using GUID_DEVCLASS_PORTS (a driver may
    fail or choose not to register the GUID_DEVINTERFACE_COMPORT interface)
  * axl_g: g::Module::getSystemInfo should return a const-pointer
  * axl_g: removed leading underscore from AXL_CPP_xxx_VERSION defines
    (for consistency)
  + axl_g: added NOMINMAX definition under windows
  + axl_err: added a constructor overload for err::Error to allow passing string
    literals as errors
  + axl_sl: added an assert to StringRef::attach (length must not be -1)
  + axl_mem: added a simple mem::Pool <T> template class for fixed-sized memory
    pools
  - axl_io: fix: must clear flow control fields in the DCB prior to setting the
    new value
  * axl_g: minor cleanup of the warning suppression file

................................................................................

version 3.8.3 (2017-12-15)

  introduces: major redesign of Jancy IO model, support for guard-page-based
  GC safe-points on Windows x64, advanced IO & buffering options in plugins

  Main application changelog:

  * nj_app: show error message in message box only if there's no plugin startup
    dialog
  * nj_srv: always return 0 on success; print error messages to stderr
  - nj_app: critical bugfix: don't nullify SessionStartupSyncReqSlot in
    processMsg_OnStartupCompleted (could lead to a deadlock if plugin failed to
    load properly)
  - nj_app: bugfix: receiving transmit-disabled notification should not affect
    the transmit pane unless the document is active
  + nj_log: added StdRecordCode.RxBufferFullLossless &
    StdRecordCode.RxBufferFullLossy
  + nj_srv: add errors & exceptions to the main log
  - nj_gui: bugfix: incorrect check EnumProperty::setCurrentIndex (should be
    >= count)
  - njs_srv: fix: check m_workerThreadTerminateFlag in worker thread request
    processing loop
  - nj_app: bugfix: next-time combo box in crash report dialog was not
    serialized properly
  - nj_app: bugfix: usage report and crash reports could not be disabled (even
    for paid licenses) - the check for a paid license was made too early (before
    license mgr initialization)
  - nj_srv: crash during compilation stage caused invalid manifest collection
    (log is not opened)
  + nj_app: allow guard page safe points on win64
  - nj_app: bugfix: transmitting a file caused invalid selection in history
    combo
  - nj_app: bugfix: submitting usage report during the initial open (e.g.
    `ioninja serial`) lead to a crash
  * nj_srv: link to dbghelp.lib on windows. somehow it worked without explicit
    linking on msvc10, but it doesnt on msvc14
  - nj_app: fix: handle server process exit (e.g. during system
    shutdown/restart)

  Scripts changelog:

  + scripts: ported tcp connection socket, udp socket, ssh channel, tcp proxy
    and serial to the new jancy io model
  + scripts: added advanced buffering options to serial and all socket-based
    plugins:
    * read parallelism
    * read block size
    * rx buffer size
    * tx buffer size
    * keep read block size
    * keep write block size
  + scripts: added advanced socket options to all socket-based plugins:
    * tcp keep-alives
    * tcp nagle
    * tcp reset
    * re-use address
  + scripts: added advanced serial port options to the serial plugin:
    * read interval
    * comstat check
    * wait for the first char

  Ninja Scroll engine changelog:

  + njs_wdg: added support for ESC D, ESC M
  - njs_wdg: fix: properly handle newline inside a scroll-region
  - njs_wdg: fix: when deleting lines, fill the space with background color
  - njs_wdg: fix: terminal widget did not always invalidate necessary lines on
    scroll
  + njs_wdg: improved support for xterm scroll regions
  - njs_wdg: bugfix: cursor pos should be re-validated after console size
    change (could lead to crashes on terminal resize)

  Jancy changelog:

  * jnc_io: use the new axl::io::Serial::open to open serial port in
    asynchrounous mode
  + jnc_sys: added sys.g_systemInfo property
  + jnc_api: added alias _JNC_CPU_IA32 (the same as _JNC_CPU_X86)
  - jnc_ct: fix: set value to ValueKind_Void when const-casting to (void)
  - jnc_ct: fix: incorrect check for void value in ControlFlowMgr::ret
    (const Value&)
  + jnc_io: added SocketOption_TcpKeepAlive (translates to SO_KEEPALIVE)
  + jnc_ct: fix: handle returning of values from void functions
  + test: added a test for checking the recent modification re gc
    shadow stack frame maps
  - jnc_ct: critical bugfix: for-loop had incorrect sequence of
    jump/close-scope (could lead to premature release of temp gc-heap vars)
  * jnc_ct, jnc_rt: critical update: changed the way shadow stack frame
    maps are initialized and set
  * jnc_ct: remove Unit* argument from OperatorMgr::parseXxx (...) set
    of functions;  instead, set current unit explicitly (the same spot where
    we open namespaces)
  * jnc_io_base: redesigned io.Socket
  + jnc_io_ssj: redesigned class io.SshChannel
  + jnc_io_base: redesign of io.Serial class (using async event model)
  + jnc_io_cmn, jnc_io_base: added io.AsyncIoDevice (will be base for
    all asynchronous IO classes: Serial, Socket, SshChannel, etc)
  * jnc_ct: bool should belong to TypeKindFlag_Integer
  - jnc_ct: incorrect assert in ClassType::markGcRootsImpl -- opaque
    classes may be derived from!
  - jnc_ct: fix: bitwise-xor operator should keep bitflag enum type (just
    like bitwise-or)
  * jnc_rt: switch to vectored exception handling on windows; remove
    seh frames remove jnc_handleSehException;
  * jnc_rt: by default use gc guard page and no explicit check-calls everywhere
  + jnc_rt, jnc_ct: added rt::ExceptionMgr to handle null-ptr-access &
    div-by-zero with signals on POSIX and with vectored exceptions on Windows
  * jnc_ct: split entry block into two: alloca & prologue
  + jnc_ct: ported to llvm-5.0

  AXL changelog:

  - axl_io: fix: clear "bad" termios attributes
  + axl_io: apply read interval via c_cc VTIME:
  + axl_io: modified io::Serial::open to allow choosing sync vs async
    using io::FileFlag-s
  + axl_g: added alias _AXL_CPU_IA32 (the same as _AXL_CPU_X86)
  * axl_sl: treat uninitialized empty CircularBuffer as valid
  + axl_io: added axl::io::win::Socket::wsaGetOverlappedResult (...)
    methods
  + axl_sl: added sl::CircularBuffer:drop method
  + axl_sl: added sl::Handle::takeOver method
  + axl_sl: added a simple circular buffer class sl::CircularBuffer
  + axl_sys_win: try to FormatMessage (FORMAT_MESSAGE_FROM_HMODULE) for
    getting NTSTATUS description if RtlNtStatusToDosErrorFunc failed
    (returned the same code)

................................................................................

version 3.8.2 (2017-11-24)

  introduces: major optimization in ninja scroll logging engine for bin-text
  lines and large log files (plus a few critical bugfixes), a critical bugfix
  in jancy scripting engine, hi-precision (sub-microsecond) timestamps on
  windows 8+, crash reports, usage reports, new version popup notifications.

  Main application changelog:

  - nj_doc: fix: reset current directory to root in StorageParser::finalize
  - nj_app: bugfix: clicking "reset terminal" in terminal context menu was
    incorrectly directed to the active document (wrong for floating terminals)
  + nj_app: added floating/tabbed items to the terminal context menu
  + nj_app: implemented play-log-in-terminal functionality
  + nj_app: collect and submit crash-reports (configurable: always-on/confirm/
    off)
  + nj_app: added a popup dialog when a new version is found (configurable:
    popup/asteris/off)
  + nj_app: encrypt usage and crash reports (configurable)
  - nj_app: set fixed size for the status-bar (to prevent if from being
    stretched by plugins)
  - nj_app: don't do any network requests until a user presses "Agree" on the
    initial nag screen
  - nj_app: bugfix: clicking Remove All on the Add-on Plugins page could lead to
     a crash
  - nj_app: bugfix: layerPluginUsageStats argument list was not null-terminated
    (caused occasional crashes)
  - nj_app: use RtlGetVersion instead of GetVersionEx (which may lie about the
    actual OS version depending on the app' manifest)
  + nj_app: generate a unique installation ID and submit it in every usage
    report
  * conf: changed comments from // to #
  + all: generate linker debug information in Release builds
  + package: create an extra archive with pdb files
  + legal: added privacy.txt file with detailed description of our privacy
    policy

  Scripts changelog:

  + scripts: sniffer: added handling of io.PcapEventCode.IoError
  + scripts: ssh: track console size changes during connect
  + scripts: added default remote port setting to TCP, UDP & SSH sessions
  + scripts: use std.getPreciseTimestamp in log
  - scripts: removed debug printfs
  + scripts: added PID information to all tdevmon-based monitors
  + scripts: added gui.ComboBoxHistory class extenstion all the scripts now use
    it instead of (now removed) gui.ComboBox.addEditTextToHistory
  * wizards: change icons for all the plugins (previously it was a tennis ball
    from the Echo plugin, now it's a generic "plugin" icon)

  Ninja Scroll engine changelog:

  - njs_log: critical bugfix: merge-id should be a part of each index
    leaf (not just merged ones)
  * njs_log: only processUiEvents on rebuild (otherwise, it introduces
    unnecessary latency on incremental log updates)
  * njs_wdg: don't scroll to bottom on resize by default (do that for
    terminal widget only)
  - njs_log: critical bugfix: in bin-text line we should check for
    enc::utfIsPrintableNonMark (not just enc::utfIsPrintable) -- could cause
    occasional crashes
  - njs_log: fix: codec for wchar_t is platform-dependent (utf16_t/utf32_t)
  + njs_log: show tooltips with HEX-ASCII/U+ notation for bin-text lines
  - njs_log: fix: default copy processing for bin-text lines should
    take actual data bytes, not binText string (because binText is
    translated regarding tabs/unprintable chars)
  * njs_log: major update: don't hide '\r' and '\n' in bin-text-lines
    (show as unprintable char)
  - njs_log: fix: keyboard jumps over tabs in bin-text lines
  - njs_log: fix: update m_partIdx of the bin-text line if it's empty during
    add-data
  - njs_log: critical bugfix: bin-text lines incorrectly handled
    multibyte unicode chars being split inside the code-point
  * njs_log: major optimization update:
    - optimized index tree re-balancing
    - delayed UI updates on index rebuild
    - added support for incremental re-indexing (large logs are now immediatly
      usable)
    - UTF buffer-based batch decoding (previously it was per-code-point)
  * njs_wdg: don't auto-scroll terminal console on write (use the same logic as
    with the log -- if the bottom line is visible, then scroll to bottom)
  + njs_wdg: added support for CSI L/M (insert/delete lines), CSI d/G
    (set cursor line/col) and CSI !p (soft terminal reset)
  - njs_log: fix: empty log was not handled properly in CacheMgr::processCache

  Jancy changelog:
  - jnc_ct: major update/bugfix: StdFunc_AllocateXxx/StdFunc_TryAllocateXxx
    should return StdType_AbstractDataPtr, not StdType_DataPtrStruct.
    this under certain circumstances could cause premature release of
    temporaries which in turn was leading to UB including crashes
  - jnc_rt: fix: assertion failure could still occasionally fire
  * jnc_ct: remove dummy field from StdType_AbstractData; instead, just
    force-set flags (gc-root & non-pod)
  + jnc_io_pcap: added event io.PcapEventCode.IoError
  + jnc_sys: added std.getPreciseTimestamp => axl::sys::getPreciseTimestamp
  * jnc_ct: cleaned up using-sets implementation (now applicable to imports
    and orphans)

  AXL changelog:

  - axl_io: critical bugfix: non-atomic file size grow in
    io::SharedMemoryTransportBase on POSIX (could lead to SIGBUS)
  + axl_ini: support empty sections in .ini files (may be useful to reset
    to root directory)
  - axl_g: fix: _AXL_GCC_ASAN was detected incorrectly on clang
  - axl_io: critical bugfix: block size for file copying should be a
    multiple of systemInfo->m_mappingAlignFactor
  + axl_gui: added support for tooltips
  + axl_enc: added access to the accumulator in CodePointDecoder
  * axl_io: changed default MappedFile read-ahead size to 64K
  * axl_gui: minor update in WidgetDriver::postThreadMsg API
  + axl_gui: added Engine::processUiEvents
  + axl_enc: major update in char codecs (support for buffer decoding
    in CodePointDecoder, support for single-pass decoding + codepoint map
    calculation)
  + axl_cry: added axl::cry::Rsa::publicEncrypt/privateEncrypt/
    publicDecrypt/privateDecrypt
  + axl_cry: added cry::AesKey wrapper class for AES block encryption
  + axl_sys: implemented hi-res timestamps on mac (via mach_absolute_time)
    for testing (production version is still using gettimeofday)
  - axl_sl: bugfix in PackIntTrunc: va_arg was called twice
  - axl_sys: removed qpc-based precise timestamps on windows; instead,
    use GetSystemTimePreciseAsFileTime available in win8+
  + axl_gui: added support for ansi attr inversion
  - cmake: don't use -static-libgcc/-static-libstdc++ on clang (not supported)

................................................................................

version 3.8.0 (2017-10-20)

  introduces: major terminal emulator redesign, regular expression colorizer
  layer plugin, add-on plugin management system, support for layer plugin
  persistency in saved log files and session files, support for key
  authentification in Jancy class io.SshChannel and in the SSH plugin, new
  Jancy class jnc.RegexDfa for compiling and matching dynamic regular
  expressions (uses the same engine as the 'reswitch' statement).

  Main application changelog:

  * nj_app: major redesign of the terminal widget
    - now it can be floating or tabbed
    - can be fixed-sized or auto-sized
    - when it's auto-sized, the size tooltip is shown on resize
  * nj_app: terminal: fixed bugs in arrow key mapping
  * nj_app: added tab close button, i need it to add it to the terminal tab,
    it's closable now (but not the log tab!)
  * nj_app: delay terminal console size adjustment (otherwise, lines are
    cropped prematurely)
  * nj_app: inverted the terminal mouse roles when xterm mouse-mode is set:
    send clicks by default; select/context-menu when Ctrl is pressed
  * nj_app: re-design of transmit history:
    now text transmit, binary transmit and file transmit all have independent
    histories. previously having shared history for text+binary transmit caused
    problems with escape-sequence in the text pane
  * nj_app: fixed persistency for the file transmit page (previously it was
    always empty on session start, even when we've set the file previously)
  * nj_app: added support for layers in saved session files
  * nj_app: added per-plugin resource directories
  * nj_app: save document settings as defaults upon closing the settings dlg
  * nj_app: fix: actions for recent files in the file menu were not connected
  * nj_gui: added support for enabling/disabling for action (link) properties
  * nj_srv: apply default settings on add layer
  * nj_srv:suspend/resume log server on add & remove layer
    suspending helps avoiding premature rebuilding of log index when layer
    adds converters/representers
  * nj_gui: added methods: gui.PropertyGrid.removeProperty and
    gui.GroupProperty.removeProperty
  * nj_app: added user plugin setting page
  * nj_app: set fixed size for the nag dialog (measure by the image)
  * nj_app: disable already added layers in the "new-layer" drop-down menu
  * nj_srv: added doc.PluginHost.m_logThreadScheduler
  * nj_srv: added doc.PluginHost.m_pluginGuid
  * nj_srv: added support for multi-class-guids in log files
  * nj_srv: adapted log api to the new representer stack architecture
  * nj_srv: moved std record code representer into a dedicated class
  * nj_srv: save log file now takes the last log record file in converter stack
  * nj_app: brought back the Add Layer toolbar button
  * qtpb: hide alpha channel in color properties
  * qtpb: adjusted the display format in flag properties
  * qtpb: added QVariant user data to properties
  * nj_gui: added gui.ColorProperty, gui.ActionProperty, gui.FlagProperty,
    gui.FileProperty
  * nj_gui: fix: insert properties to the group of particular plugin
  * nj_app: added tooltip label (QToolTip has certain issues with widget
    activation/deactivation). i need something simple and predictable to show
    terminal console size
  * nj_app: updated icons (also, added a terminal icon)
  * nj_app: fixed buddies and tab order on all the dialogs
  * package: added NSPrincipalClass=NSApplication to Info.plist in Mac packages
    (crucial for high-DPI support)

  Scripts changelog:

  * scripts: fix: modbus plugin should use a volatile variable for checking
    for role inversion (the value of property is not volatile and not
    guaranteed to return the correct result after the change). timing is
    critical on startup (if we apply a modbus rtu layer with role inversion
    to an already captured log)
  * scripts: MosBus RTU: added support for role inversion: TX/RX - Master/Slave
    also, improved the handling of invalid ModBus frames
  * scripts: fixed regex colorizer race issues (log thread vs main thread)
  * scripts: minor fixes in the file and hw-serial-mon plugins
  * scripts: added the 'Remove all extra patterns' action to the regex
    colorizer plugin
  * wizards: bugfix in syntax highlighter wizard (length should be updated
    each iteration)
  * wizards: fixed a typo in TX/RX test plugin wizard
  * scripts: added gui.rgb function
  * scripts: ssh: added key authentication
  * scripts: serial: removed flow control combo box (available via property
    grid)
  * scripts: added regex colorizer layer

  Ninja Scroll engine changelog:

  * njs_wdg: added support for CSI set scroll region command
  * njs_log: write bin-format to clipboard on bin-copy mode
  * njs_log: added "smart" copy logic for bin-hex lines:
    when selecting in the hex part, the copied text will contain hex codes;
    when selecting in the text part; the actual text will be copied
  * njs_log: added support for CopyBinKind_HexView
  * njs_wdg: added support for mouse mode change notifications
  * njs_log: critical bug fix in njs::Server::processSyncReqList
  * njs_wdg: terminal: added support for CSI n P (erase chars)
  * njs_wdg: fixed a repaint problem on full erase
  * njs_log: added support for multiple class guids in a single log file
    (crucial for io ninja layers)
  * njs_log: moved fold flags to a dedicated fold  file (now we don't have to
    enforce read-write when opening logs; also, it's possible to have multiple
    log servers working with the same log file)
  * njs_log: added support for suspend/resume (may be necessary when building
    complex layer stacks)
  * njs_log: added support for user callbacks in the log thread (necessary to
    synchronize io ninja converter layers)
  * njs_log: show page boundaries under debug

  Device Monitor changelog:

  * dm_lnx_lkm: fix: in-header inline functions must be static to make
    gcc happy
  * make: added variable LINUX_BUILD_DIR to override build dir when
    needed
  * dm_lnx_lkm: implemented write-protection disabling for arm32
    now tdevmon can be used on Tibbo LTPS LTPP3 boards for serial monitoring
  * dm_lnx_lkm: use do_div instead of direct int64 division on arm32
  * dm_lnx_lkm: bugfix: Device_p_unhook did Hook_stop sequence
    incorrectly
  * dm_lnx_lkm: warning fix: ioctl arg is long, must be cast to
    (uintptr_t) before casting to (void*)
  * cmake: added an option for lkm target in cmake project

  Jancy changelog:

  * jnc_ext: fix: consumed length calculation in jnc.RegexState did not work
    properly for negative offsets
  * jnc_ext: added support for buffer replay after a successful match in
    incremental jnc.RegexState/jnc.RegexDfa
  * jnc_ct: critical bugfix: reactor iface classes were not properly
    shared
  * jnc_ct: bugfix: skipping non-trailing default arguments crashed the
    compiler (need to do explicit check for null jnc::ct::Value-s)
  * jnc_ct: allow finishing commas in named-based curly initializers
  * jnc_rtl: implement full reset in RegexState::reset
  * jnc_rt: added Runtime::m_userData field (rather convenient when
    there are multiple runtimes, like with ioninja plugin stack)
  * jnc_rtl: removed RegexDfa.incrementalMatch
  * jnc_rtl: added RegexDfa class
  * jnc_io_base: typo fix in io.Socket
  * jnc_io_base: minor sync bugfix in io.Serial (m_ioFlags must be
    accessed under lock)
  * jnc_io_ssh: added support for key authentication
  * jnc_io_ssh: bugfix: SshChannel::write returned 0 on success (must return
    the actual size)
  * jnc_ct: fix: OperatorMgr::getConditionalOperatorResultType should
    use closure-aware types of operands

  AXL changelog:

  * axl_io: fix: io::SharedMemoryTransport did not release the lock on
    open-error
  * axl_gui: export TextPainter::buildBinTextString for public use (the
    same code which is used for producing hex-view strings)
  * axl_sl: minor fix in sl::ListBase::moveXxx to allow usage of these methods
    from sl::BoxList
  * axl_io: typo fix in the POSIX impl of io::getDir
  * axl_io: bug fix in the POSIX impl of io::copyFile
  * axl_sl: added sl::List::eraseHead/eraseTail for consistency
  * axl_io: expose const io::File* via io::SharedMemoryTransport::getFile (for
    uniformity with io::MappedFile)
  * axl_io: io::MappedFile now provides information about the actual end of a
    mapping
  * axl_io: expose const io::File* via io::MappedFile::getFile
  * axl_io: added io::copyFile () overload (accepting a const io::File*
    instead of a source file name)
  * axl_fsm: fix: calling RegexCompiler::makeDfa with an empty regex caused
    a crash

................................................................................

version 3.7.8 (2017-09-15)

  * devmon: criticial bugfix: opportunistic BSOD (read beyond the end of a
    buffer during scatter-gather collection on IRP_MJ_CREATE/
    IRP_MJ_CREATE_NAMED_PIPE/IRP_MJ_CREATE_MAILSLOT)
  * devmon: fix: self-hooking attempts detection and prevention in tdevmon
    for Linux
  * devmon: fix: tdevmon --stop-core-service always failed as long as there
    is at least a single filter device attached
  * devmon: fix: if the core service could not be stopped, MSI would misbehave:
    it could failed instead of asking for a reboot or do not ask for reboot at
    all
  * plugins: SerialMon: extend port combo (space is unused, anyway)
  * plugins: Serial: added read buffer size setting
  * plugins: ModBus: added support for field-clicks in decoded ModBus messages
  * plugins: ModBus: bugfix: upon a successful decode of a ModBus message, a
    chunk of raw data was doubled
  * nj_app: added terminal settings for backspace key mode, home-end key mode
    and function key mode
  * nj_app: added proper handling of double-click in terminal
  * nj_app: remember last open-file dir
  * nj_app: fix: on Windows and Mac ignore extension case when auto-detecting
    open-file type
  * nj_srv: reset base timestamp to the first line of the log if it's not empty
    otherwise, it produces weird "minus" times when opening existing logs
    and/or sessions
  * nj_gui: added properties m_minValue, m_maxValue, m_spinBoxStep to the
    class gui.IntProperty
  * axl_sys: fix: month number should be one-based, not zero-based
  * njs_log: fix: handle double-click on hyperlinks as a normal click (don't
    select-word)
  * njs_wdg: added support for character sets (in particular, line-drawing
    character set) in the terminal widget
  * njs_log: added support for backward-bin-range-highlighting

................................................................................

version 3.7.7 (2017-08-31)

  introduces: Tibbo Device Monitor for Linux, Serial Monitor plugin for Linux,
  support for monitoring the Fast IO and remote pipe/mailslot connections
  on Windows, dual WHDC-compatible signing of Windows drivers with SHA-1 and
  SHA-256 EV certificates for Windows 10 1607+ compatibility, two critical
  BSOD fixes, dynamic structures in Jancy language.

  * nj_app: added the "What's New" dialog
  * nj_app: cleaned up QT widget/dialog layout issues
  * nj_app: removed the "Key Translation" terminal setting (never was fully
    implemented); added the 'Enter key mode' setting (CR/LF/CR-LF) instead
  * nj_io_mon: added support dual device monitoring (e.g. \device\namedpipe and
    \device\lanmanredirector); this allows for monitoring remote pipe/mailslots
  * moved all *.jncx into 'extensions' dir in tar package
  * devmon: file name wildcards can contain multiple \r - separated wildcards;
    to pass a file name must match all the wildcards using AND logic)
  * devmon: added notifications for FastIoRead/FastIoWrite/FastIoDeviceControl
    -- this is crucial for monitoring the named pipe IO on Windows (otherwise,
    a substantial part of pipe traffic is unlogged)
  * devmon: improvement: MSI installer should not ask for reboot during upgrade
    unless that's really necessary -- before it *may* have asked for reboot
    even when services could be cleanly stopped
  * devmon: fix: IRP_MJ_FILE_SYSTEM_CONTROL file id and data was not properly
    displayed in tdevmon console utility
  * devmon: critical bugfix: BSOD on METHOD_NEITHER IOCTLs when either IN or
    OUT buffer is NULL (due to unconditional MmGetSystemAddressForMdlSafe on
    NULL MDL)
  * devmon: critical bugfix: an opprtunistic BSOD crash during open file
    notification on IRP_MJ_CREATE/IRP_MJ_CREATE_NAMED_PIPE/
    IRP_MJ_CREATE_MAILSLOT -- due to incorrect usage of FILE_OBJECT::FileName
  * devmon: ported tdevmon console application to Linux
  * devmon: added Linux loadable kernel module (LKM) and usermode library
  * devmon: added scripts for WHDC signing with the new EV certificate
  * devmon: bugfix: a leak in HashTable_remove (entry was removed, but not
    actually freed)
  * cmake: added QT_COMPILING_QSTRING_COMPAT_CPP and
     QT_COMPILING_QIMAGE_COMPAT_CPP to QT-based modules. this way, the resulting
    binary has less import symbols and is more likely to run when linked against
    older versions of QT
  * cmake: added gcc settings for -static-libgcc and -static-libstdc++
    (static by default). this way, the resulting binaries are more likely to run
    on different linux distros
  * ported Serial Monitor plugin to Linux
  * jancy: added dynamic structs (dynamic layour via non-const-sized arrays)
  * axl: fixed typos in sl::String::getLeftSubstring/getRightSubstring
  * axl: catch out-of-memory error in Array::reserve
  * axl: added assert to getMinPower2Gt to catch values with highest-bit set
    to one
  * njscroll: fixed a regression introduced with dual bin hex lines
    CachedLine::isBin was broken, which lead to incorrect painting of
    bin-text lines

................................................................................

version 3.7.5 (2017-07-06)

  * njscroll: ensure visible cursor on paste
  * njscroll: scroll the widget if necessary on insert/delete data
  * sh: updated build-packages shell scripts for all opensource projects --
    should use cpack rather than hand-made shell scripts (which are all
    removed now)
  * nj_app: added support for time-limited evaluation licenses
  * nj_app: re-designed the license dialog
  * ecckey: added support for time-limited (expiring) product keys
  * ecckey: added srand() -- otherwise, product key padding is always
    the same
  * jnc_sys: added g_env property for accessing system environment
    variables

................................................................................

version 3.7.4 (2017-06-03)

  * nj_app: bugfix: having both a session and a log opened and then closing
    first the session and then ioninja lead to a crash
  * njs_log: auto-convert logs from ioninja 3.5.x
  * nj_app: removed api.conf (not needed anymore)

................................................................................

version 3.7.3 (2017-05-17)

  internal release.

  * jnc_ct: ported to llvm-4.0; compiles and runs under llvm versions 3.4.2
    to llvm-4.0.0
  * jnc_ct: named import types used in orphaned functions/reactors are
    re-anchored (no more need to qualify nested types in orphaned methods)
  * njs_log: bugfix: crash if dual bin hex block happen to span cache page
    boundaries
  * nj_app: bugfix: hex editor incorrectly reported selected range if cursor
    was at ASCII-EOL position

................................................................................

version 3.7.2 (2017-05-03)

  introduces: Hardware Serial Monitor for UART/SPI/I2C; USB Endpoint Terminal;
  dual binary blocks in Ninja Scroll Engine.

  * axl_gui: bugfix: TextPainter::drawHyperBinHex incorrectly checked
    for an empty attr array
  * nj_app: bugfix: when a session was created after closing a previous one,
    session property grid was often inaccessible for editing
  * axl_gui: shift+Tab support
  * nj_app, nj_log: added support for dual-bin view
  * nj_log: break record support
  * nj_gui: proper group property support
  * axl_gui: make HyperText use UTF-32 for text storage; this way makes it
    possible to use unicode chars in IO Ninja text log lines
  * jnc_ct: implemented const casts for class pointers -- this is critical for
    doing class-ptr upcasts from variants
  * jnc_ct: critical bugfix: don't fallback to llvm cast post-compile
  * jnc_ct: allow casts to void (crucial for conditional operators)
  * jnc_std: bugfix in Array::insert/Buffer::insert methods (they always copied
    new data into the beginning)
  * njs_log: added PartKind_Break for inserting breaks between mergeable
    messages

................................................................................

version 3.7.1 (2017-04-14)

  introduces new features in Jancy language: 'reswitch' statement; 'cmut'
  modifier; variant containers (arrays, lists, hash tables, rb-trees);
  redirectable stdio; raw literals; indexer properties; disposable pointers;
  declarations in reactors.

  * scripts: move io_ModBus.jnc/io_TcpIp.jnc to common folder (not really api)
  * jnc_ct: allow writing formatting literals as f"..." ($"..." is also ok)
  * axl_err: bugfix: StdErrorCode_String incorrectly handled string length
    (off-by-one)
  * ioninja: fix: master encoding was never really saved (reset to UTF-8 each
    time)
  * jnc_ct: fix: array->ptr casts, also for const values (required for
    variants)
  * jnc_std: cleaned up std classes StringBuilder/HashTable/RbTree
  * jnc_std: removed unused structs/classes (std.BufferRef/std.StringRef etc)
  * jnc_std: added std.RbTree, redesigned std.HashTable
  * jnc_ct: bugfix: thunk function compilation failed if function had
    call-conv-dependent arg coercion
  * jnc_ct: fix: non-POD struct field access was essentially unchecked
  * axl_sl: breaking change: eliminated diversity BinTree/BinTreeMap and
    HashTable/HashTableMap
  * jnc_ct: major update: redesign of dual modifiers, implemented dual
    modifier 'cmut' (container mutability).
  * jnc_std: added std.Array class
  * jnc_std: added gets, print, perror and make stdio adjustable by the
    host application (via jnc::setStdio)
  * jnc_ct: relaxed the requirement to use 'indexed' modifier when declaring
    indexed properties
  * axl_sl: bugfix in sl::CmdLineParser -- parse switch prematurely
    terminated the switch value upon discovering a space
  * jnc_ct: added support for raw literals (non-escape-decoded)
  * jnc_ct: redesign of automatons -> regex switches
  * jnc_rt: suppress unwinding on longjmp on windows x64 (doesn't work
    properly -- at least with LLVM 3.9.1)
  * scripts: remove types in bindable aliases, remove terminating semicolons
    from curly-initialized declarations
  * jnc_ct: update in grammar: allow curly-initialized declarations to
    be non-terminated with ';'
  * jnc_rt: fix: assert in GcHeap::parkAtSafePoint could occasionally
    fire due to its wrong placement -- it should be placed *before*
    atomicDec (&m_handshakeCount)
  * jnc_ct: indexer properties implemented
  * jnc_ct: function redirection implemented
  * jnc_ct: alias redesign
  * jnc_ct: major update: member & index operators for variants
  * jnc_ct: disposable pointers
  * jnc_ct: redesign of automatons -> regex switches
  * axl_sl: bugfix in sl::Pack -- size calculation for simple types did
    not advance va_list
  * axl_fsm: supportfor simple quantifiers, e.g \h{8}
  * axl_fsm: capturing groups
  * axl_sl: added support for and-not operation to BitMap::merge
  * jnc_ct: allow declarations in reactors
  * jnc_ext: move gc stuff from std to sys
  * jnc_ct: redesign module constructors/destructors (allow
    one-per-unit)
  * jnc_ct: removed 'delete' operator (prolly, never gonna be supported)

................................................................................

version 3.7.0 (2016-12-20)

  provides a critical fix in Serial plugin.

  * jnc_io_base: major update in Serial class -- fixed EV_RXCHAR-related data
    loss and completely removed interval timeouts on windows. As it turns out,
    certain drivers do not follow WinAPI guidelines on EV_RXCHAR notifications
    and serial timeouts and it may cause IO Ninja to hang indefinitely
  * nj_app: proper updates of transmit pane during switching and closing of
    documents
  * don't disable transmit pane in monitor and linked sessions (could be used
    as a scratch-pad). "send" button is disabled anyways
  * dm_app: bugfix: %lld implies 64-bit, but the argument was intptr_t; it
    caused a crash during monitoring on 32-bit machines
  * njscroll: assertions in mergeEditTransactions could actually fire
    (if we select and then replace by typing)
  * njscroll: make selectAll (Ctrl+A) keep the cursor in the same pane it was
    before (Hex-vs-Ascii)
  * nj_app: keep transmit histories separate for different sessions; also,
    don't save/restore histories (only current blocks).

................................................................................

version 3.6.8 (2016-11-25)

  * axl_sys: add unix-windows time epoch difference to POSIX timestamps
  * axl_enc: critical bugfix in Base32 implementation
  * axl_cry: critical bugfix: we should update signature size after ECDSA_sign
  * axl_sys: bugfix in POSIX timed wait (absolute timespec was calculated
    incorrectly)
  * jnc_io: bugfix: on POSIX checking socket for FD_WRITE should happen
    AFTER connect
  * nj_ssh: rename io.SshEvent->io.SshEventCode (to reflect change in jnc_ssh)
  * jnc_ct: support for $! in formatting literals (expands to
    std.getLastError ().m_description)
  * jnc_api: critical bugfix: propagateLastError should use
    axl::err:getLastError, not jnc_getLastError
  * scripts: update scripts to use the new properties
    io.Socket.m_isSocketEventEnabled and
    io.FileStream.m_isFileStreamEventEnabled
  * scripts: read all incoming data before closing the socket in disconnect
    event handler
  * all the libs/frameworks added as submodules; list of submodules: axl,
    doxyrest, ecckey, graco, jancy, njscroll, qtpropertybrowser, minhook
    devmon
  * axl: fix: sl::String & ref::Buf should handle in-buffer copies/inserts/
    appends properly (either by in-buffer shifts or by add-reffing the original
    buffer to keep it intact)
  * jnc_io: Serial::setDtr/setRts should modify property-holding values
  * axl_enc: UTF trie is now ICU-based
  * jancy: allow untyped aliases;  mostly it's done to allow simple aliasing
    of 'dispose' method, like: alias dispose = close
  * jancy: typo: setas declaration had no effect
  * jancy: fix: io.File was not properly added to IoLib
  * ioninja: use _wfopen for log file on windows (otherwise it doesnt work for
    unicode-user-names)
  * ioninja: show command line output if server process finishes BEFORE
    transport has been established.
  * jancy: typo in jnc_Type.h (jnc::TypeKind_Long was mapped to int32, not to
    int64)
  * axl: support for \v in escape encoding engine
  * jnc_ct: multiline literals syntax change: i feel it's better to make it look
    like python docstrings, using triple quotation """
  * jnc_ct:  unified hex/octal/binary/decimal constants/literals and added
    support for multiline binary literals 0x""", 0o""", 0b""", 0n"""
  * jancy: remove int8..int64 keywords, instead use the same keyword system as
    in C/Java: int, char, short, long + one non-standard keyword: intptr.
      char -- signed 8-bit int,
      short -- signed 16-bit int,
      int -- signed 32-bit int,
      long -- signed 64-bit int.
    the rest is defined just like in stdint.h: int8_t, int16_t, etc. this way
    it's much easier to switch between C and Jancy (i constantly make typos
    myself).
  * jancy: remove C pseudo-inheritance via JNC_BEGIN_INHERITED_STRUCT
    alas, this approach doesn't work on gcc anyway;

................................................................................

version 3.6.7 (2016-07-28)

  * all: suppress -rdynamic by default. turns out, (at least) on Linux, CMake
    adds -rdynamic to the link flags, which results in dll hell on steroids
  * axl: remove kernel32.GetThreadId dependency (missing on Windows XP)
  * devmon: print extended information message when driver's signature is
    rejected (may happen on vanilla Windows 7 because of SHA-2 certificates)
  * ioninja: tx/rx test wizard
  * ioninja: layers should be able to filter transmission (before transmission
    was directed to the main plugin (head of plugin stack)
  * ioninja: if layer representer is unable to represent a log message, we
    need to fall back to the previous representer (before it worked only for
    log converters)
  * jancy: critical bugfix: lifting variables could lead to incorrect current
    gc shadow stack frame
  * ioninja: bugfix: if the 2nd (or later) plugin passed in command-line failed
    compilation, both ioninja and ioninja-server processes remained in limbo
    state.
  * ioninja: answering machine wizard generated a project which would not
    compile out-of-the-box
  * axl: critical bugfix: buffer overrun in axl::enc::CharCodec class
  * ioninja: installer should put bundled packages into user temp folder, not
    to INSTALLDIR; otherwise it's impossible to delete em afterwards
    (not with UAC on) so previsouly on all UAC machines we had winpcap.exe and
    tdevmon64.msi remaining after installation. the solution is to use a temp
    folder (SUPPORTDIR). It is generated using ProductCode, which will be new
    every MSI build. in this case we don't have to worry about conflicts and we
    can delete this folder without elevation.
  * ioninja: critical bugfix: installer checked tdevmonc.sys version
    incorrectly: ioninja uses major-minor-revision versioning, windows uses
    major-minor-build-revision versioning. MSI used ioninja version rather
    than windows version; this resulted in "...installed version appears to be
    older..." message all the time (even when it's not)
  * jancy: remove server stuff; re-organize JncApp structure
  * axl: extra utility methods in StringRef
  * axl: reverseMemMem using BoyerMooreFind
  * axl: ref::BufHdr methods for checking pointer being inside/outside
  * axl: wrapper for lua_pushvalue; support for relaying arguments to
    LuaStringTemplate::process
  * axl: major redesign: String/StringRef; Array/ArrayRef
  * ioninja: automatic pad-file generation

................................................................................

version 3.6.5 (2016-05-13)

  * ioninja: transmit history fixes: use hex-exncoding for transmit history
    because it seems like QT has problems with variant lists, x86 crashes
    inside QT list conversions (reproduced in isolated test app)
  * ioninja: don't add empty blocks to transmit history
  * ioninja: update transmit history buttons after load
  * jancy: important grammar update: type_name_or_expr should use expression_0,
    not expression; dynamic sizeof/countof/typeof should use expression, not
    type_name_or_expr. this way we prevent generating code for unused values
    and at the same type allow sizeof (struct-field) and countof (struct-field)
  * njscroll: typo caused only a single line to be processed (introduced when
    fixing reversed cache processors)
  * jancy: critical bugfix: after lifting a variable we need to propagate new
    frame map down the scope stack
  * axl: bugfix: after adding special handling of zero-utf32_t methods in
    sl::String enc::EscapeEncoding ::decode started to incorrectly parse \0
    escape sequence. should use append (c, 1) instead
  * jancy: unary ! operator for variants
  * jancy: critical bugfix: continueBlock in for-loop should be set at
    loopBlock, not conditionBlock
  * cmake: sanitiser flags should also be added to
    CMAKE_SHARED_LINKER_FLAGS_DEBUG (for Xcode)

................................................................................

version 3.6.4 (2016-05-12)

  * ioninja: file transmit dialog is now aware of incomplete transmissions
    and does retransmissions accordingly
  * ioninja: persistency for transmit widgets (text, binary, file)
  * jancy: io_base.jncx: TransmitBufferOverflow event removed (it was not
    really implemented anyway, and TX buffer overflow should be checked during
    send/write)
  * jancy: io_base.jncx: TransmitBufferReady event is implemented for sockets
  * jancy: io_base.jncx: synchronous and asynchronous socket modes
  * ioninja: log all jancy exceptions in ioninja-server-system-log
  * jancy: cricitcal bugfix: Runtime::uninitializeThread should restore
    exception recovery snapshot even when thread is being uninitialized
    otherwise there is a potential race: exception could have left GC shadow
    stack in invalid state, and it could be accessed if another thread happen
    to perform a collection simultaneously with GcHeap::unregisterMutatorThread
    trying to GcHeap::waitIdleAndLock ()
  * jancy: fix Timer::stop () from within onTimer event -- before it
    deadlocked
  * jancy: HashVariant should invert bigendians -- otherwise the same values
    will fall into different buckets
  * jancy: typo in sys.Timer.wait () -- single shot timer was satisfied
    immediatly
  * axl: bugfix: BinaryBoyerMoore should use uchar_t, not char -- equality
    comparisons failed because of that
  * axl: bugfix in FSM library: hexcode escapes were parsed incorrectly
  * axl: added support for hex-literals in RegExpCompiler
  * jancy: strstr & memmem
  * axl: memmem via in BinaryBoyerMooreFind
  * jancy: bugfix: each regexp in automaton function should FIRST set the
    block, THEN open scope (LLVM bugchecked with unterminated blocks if
    formatting literals were used within actions of automaton)

................................................................................

version 3.6.3 (2016-05-04)

  introduces: Tibbo Device Monitor security management; new IO Ninja sessions:
  Mailslot and Mailslot Monitor; inter-character delays during transmission in
  IO Ninja Serial session.

  * ioninja: setting dialog minimum size is properly calculated (looked bad on
    Mac and Linux KDE before); setting dialog now also installs event filter
    to disable mouse wheel in comboboxes and spinboxes -- otherwise it really
    breaks the flow of wheel scrolling and produces unwanted setting changes
  * axl: bugfix: Mac OSX axl_cf & axl_iok libraries had multi-CFRelease bug
    which occasionally crashed serial port enumerator
  * cmake: add sanitiser flags to CMAKE_EXE_LINKER_FLAGS as well — Xcode
    fails to link sanitised executables otherwise
  * ioninja: serial session: inter-char delay; also removed data-bits,
    stop-bits, parity combo-boxes from toolbar (it takes too much space)
  * jancy: keyword rename: thread -> threadlocal (otherwise it's too
    conflict-prone)
  * jancy: bugfix: sys.Event and sys.Lock should enter wait regions before
    waiting
  * jancy: jnc_sys library (Lock, Event, Thread, Timer) implemented
  * jancy: run destructors in dedicated destruct-thread (instead of running
    them synchronously during collection)
  * axl: new methods: sys::Thread::wait, sys::Thread::terminate
  * jancy: IPV6_HDRINCL is apparently windows-only -- use IP_HDRINCL instead
    on *nix
  * jancy: fix broken #ifdef structure (error introduced when implementing
    FileFlag_WriteOnly support)
  * axl: ifdef win-specific test code
  * ioninja: mailslot & mailslot monitor plugins. mailslot uses io.Mailslot
    from io_base.jncx to create server mailslot; mailslot monitor uses a
    io.MailslotMon in io_mon.jncx
  * devmon: --show-sd option doesn't really need KEY_WRITE access
  * jancy: raw sockets (almost useless on windows except for ICMP/IGMP)
    on *nix should be much more convenient for low-level network IO than pcap
  * devmon: access management
    monitor function is now controlled by configurable SD (security descriptor)
    stored in service parameters regkey; access is checked during
    IOCTL_DM_CONNECT; default SD allows access for Administrators only; if SD
    is not found in service parameters regkey or is not valid, then default SD
    is used.
  * axl: sys::win::Sid major improvements (name lookups, sid lookups, parsing
    etc)
  * axl: sl::String should handle copy, append, insert of 0 as NULL (otherwise
    it's very easy to misuse); if actual utf32_t 0 assign/append/insert is
    required, this can be achieved by specifying "count" implicitly
  * axl: sys::getTimestampFromTimeval
  * axl: ref::Buf::getSize () method
  * axl: timestamps in io::PCap -- essential when reading from file
  * devmon: keyboard & mouse service callbacks moved to tdevmonp.sys
  * devmon: support for IRP_MJ_CREATE_MAILSLOT monitoring
  * jancy: io.Mailslot class
  * jancy: support for write-only in io.FileStream
  * ioninja: Mailslot plugin
  * jancy: conditional operator with bitflag enums and zero
  * axl: io::FileFlag_WriteOnly
  * jancy: add isReusableAddress parameter to Socket::open ()
  * njscroll: bugfix: reversed cache processor cause out-of-bounds access to
    line array

................................................................................

version 3.6.2 (2016-04-15)

  * ioninja: replace empty filter in Named Pipe Mon with * -- this way we will
    not be notified of already-opened nameless files
  * jancy: sl::String -> String conversion requires explicit .cc () method
    call
  * jancy: update to prev bugfix: adding GC roots in schedule launcher
    function is not enough, cause internalPrologue adds a gc-safe-point
    which will fire BEFORE adding GC roots in schedule launcher. instead,
    add roots in internalPrologue directly. later on, remove it, also remove
    no-collect call-sites and instead add ALL user-allocated data to something
    like call-site-gc-root-set
  * jancy: critical bugfix: schedule launcher functions should mark gc-root
    arguments (otherwise it's extremely error-prone when calling scheduled
    function pointers from C++). bug discovered during crash analysis in
    Answering Machine under debug build. listener function is scheduled in the
    main thread, and it makes a gc-copy of parameter block. Parameter block
    gets collected during allocation of closure object (debug build runs
    gc-collect on every allocation), then dangling pointer gets saved in the
    closure object
  * all: add debug suffix to version strings
  * all: replace strlen/wcslen with safe NULL-checked axl_strlen/axl_wcslen
  * axl: make axl::sl::StringDetails::calcLength null-ptr safe
  * ioninja: Plugin::transmitTo/Plugin::transmitToNext methods
  * jancy: toupper/tolower in jnc_std
  * qtpropertybrowser: added support for changing property label style (bold,
    italic, underlined, color)
  * ioninja: parametrized packet template actions
  * ioninja: bugfix in reading/writing of bigendian bitfields in packet template
    widget
  * ioninja: setSrcAddress/setDstAddress actions in TCP/IP packet library.
  * jancy: bugfix: inplace const cast destroyed original const (also, fired an
    assert on cast bool->int during prepareOperand)
  * axl: bugfix: enc::EscapeEncoding::encode should clear target string first
  * jancy: Type::getDeclarationString

................................................................................

version 3.6.1 (2016-04-11)

  * ioninja: macro variable _IONJ_CRASH_DUMP to turn on/off Windows error-mode
    in ioninja-server (for Vlad Yershov crashdump request)
  * ioninja: updated icons from leonid (pipe listener, pipe monitor, modbus
    analyzer)
  * ioninja: pipe listener and pipe monitor icons from leonid
  * ioninja: proper removal of plugins should also modify common-among-plugins
    nj::log::LogRepresenter
  * njscroll: sync request should not wait if io thread is already
    stopped/stopping
  * njscroll: restore previous target record file upon converter removal
  * njscroll: fix uint32_t/uint64_t warning on x86
  * jancy: parseConstIntegerExpression should take int64_t, not intptr_t
    EnumConst::m_value should also be int64_t, not intptr_t
    added limit checks for array bounds and enum constants
  * jancy: 02_dialog sample is now correctly garbage-collected (-1 size
    trigger removed, opaque-gc-roots marked)
  * ioninja: remove all layers upon log destruction -- otherwise remove-layer
    leaves log in an invalid state (referencing desturcted and deallocated
    layer objects)
  * jancy: re-prime after destruct is just wrong -- it damages child class
    fields. also, need to figure out why we even need zeroing of Multicast
    fields after destruct. seems like a wrong and error-prone design.
  * ioninja: udp session has "show packet header" filter (to produce clean log
    when udp socket is used in one-to-one communication)
  * ioninja: serial session and serialmon session use "true" as default value
    for log filter properties
  * ioninja: default values when reading from doc.Storage
  * ioninja: modbus analyzer plugin; modbus packet library
  * ioninja: packet template mgr also adds fields from base types
  * ioninja: io_mon uses timestamp recorded by devmon (rather than current)
  * devmon: add timestamps to notifications. currently i provide completion
    timestamps only, but space is reserved for start timestamp as well. start
    timestamp would require pool allocation on irp start, so im not sure if
    it's necessary. later i can add it while staying binary-compatible.
  * jancy: bugfix: gc heap should check if TLS belongs to the same runtime
    (bug discovered during multi-layer ioninja session, each layer has its own
    runtime)
  * ioninja: serial session should get initial parity from combo box, not from
    property
  * axl: critical bugfix: io::Serial did not handle parity setting properly
  * ioninja: description update
  * cmake: add -Wno-incompatible-ms-struct warning suppression
  * jancy: llvm integer constant values were read incorrectly. address
    sanitizer helped to pin read overflow for integer constants (unconditional
    load of 8-bytes). changed to 1, 2, 4, 8 byte load depending on type.
  * ioninja: add AXL_GCC_MSC_STRUCT to 8-byte-aligned types (log.Log and
    doc.PluginHost)
  * jancy: add AXL_GCC_MSC_STRUCT to class boxes
  * axl: AXL_GCC_MSC_STRUCT macro for enforcing MSC-layout
  * axl: bool-vs-bool_t warning fix in io::win::File::setSize

................................................................................

version 3.6.0 (2016-04-04)

  introduces: Jancy exceptions and disposable variables (resource management)
  Tibbo Device Monitor FileSystem Filters; IO Ninja  Named Pipe Monitor plugin;
  relative timestamps; actions in packet templates.

  * jancy: critical bugfix: switch statement could damage gc shadow stack
    frame maps (incorrect map after break)
  * ioninja: new icons for pipe monitor and stopwatch
  * jancy: support for multiple kinds of alignment in classboxes
  * devmon: don't use FSRTL per-stream contexts cause we didn't test it -
    npfs.sys does not support it
  * devmon: replace ULONGLONG m_fileId with UINT_PTR m_fileId while preserving
    the layout (using unions)
  * ioninja: menu items for setting base timestamp as current line or current
    time
  * njscroll: new design for relative timestamps
    relative timestamps are per-logwidget now, relative to adjustable epoch
    (instead of baked into log in form of epoch records)
  * ioninja: pipe mon should inspect FSCTL, not IOCTL (for listen/disconnect
    requests)
  * devmon: support for IRP_MJ_FILE_SYSTEM_CONTROL (otherwise pipe-mon did not
    see listen/disconnect requests)
  * ioninja: pipemon - merge fileIdChanged and other informational messages
    (accepted, disconnected, closed)
  * ioninja: log message style unification (unable-to vs cannot, error
    (details) vs error: details)
  * ioninja: pipemon improvements: file-id cache & open error handling
  * ioninja: pipe mon plugin
  * axl: make win::FileHandle::getOverlappedResult return size_t, not dword_t
    (very easy to misuse on amd64)
  * axl: escape-encoding did not encode backslash properly
  * ioninja: escape-encode string values
  * ioninja: critical bugfix: FileStream hang on close
  * devmon: file name filter redesign -- instead of caching *all* file-objects
    and storing isMatch flag, we now only cache matching file-objects
    also, file name checks are only done during create/create-named-pipe
    requests -- microsoft states that FILE_OBJECT::FileName is only valid
    during IRP_MJ_CREATE/IRP_MJ_CREATE_NAMED_PIPE.
  * devmon: HashTable_removeKey should return TRUE/FALSE depending on whether
    the key was found
  * devmon: neither-method ioctl should also use AssociatedIrp.SystemBuffer
    for output buffer -- if IRP_BUFFERED_IO is set
  * devmon: support for FSRTL stream contexts (turns out, npfs.sys does not
    support them anyway)
  * devmon: HashTable method renames (remove->removeKey; removeEntry->remove
    find-> findValue; findEntry -> find)
  * devmon: critical bugfix: with NEITHER_IO and IRP_BUFFERED_IO we have to
    manually copy the buffer from AssociatedIrp.SystemBuffer (which would be
    done by IopCompleteRequest later, during APC completion)
  * devmon: we should remove file-object from cache also on unsuccessful
    open/create requests; therefore, it makes sense to rename isClose ->
    isLastRequest.
  * devmon: bugfix: we did not add CacheEntry to cacheMapEntry->m_value (so
    cache was essentially useless)
  * devmon: bugfix: incorrect setup for dm_ConnectParams
  * devmon: make wildcard string comparison in lowercase
  * devmon: file name wildcard filter
  * ioninja: session-started log record (epoch timestamp)
    we need some uniform rule for relative timestamps in different sessions.
    the problem is, often times establishing connection takes time and/or
    multiple steps, so it's difficult to use as time epoch. suggested solution
    is: before even attempting any new connection operation
    (resolving/parsing/connecting/etc), create an epoch record "Session
    started" (light bulb icon)
  * ioninja: relative timestamps
  * njscroll: relative timestamps
  * ioninja: update data ptr range check in log representor
  * jancy: replace rangeLength with rangeEnd in rt::DataPtrValidator
    it makes runtime bounds checks shorter
  * ioninja: having exception in ioninja-server during sync request loop
    caused ioninja-app to hang. on exception we have to cancel all sync
    requests first.
  * njscroll: rename MultiRangeHilite to OverlayHilite
  * ioninja: increase fade timeout (so it slowly fades)
  * ioninja: invalid check for unsigned/bigendian in PacketTemplateMgr
  * ioninja: keep/fade hilite timeouts adjusted to 750/500 msec
  * ioninja: checksum calculations for TCP/IP stack protocol headers
  * njscroll: bugfix: incorrect fade animation of multi-range highlight
    spanning multiple lines (typo, actually)
  * jancy: critical bugfix: dynamic sizeof/dynamic countof returned incorrect
    result for incremented pointers
  * ioninja: packet template action methods
    modified parts are highlighted in red (flash, then fade)
  * njscroll: leave 4-bit cursor mode when writing data
  * jancy: separate calc-layout and compile stages;
  * jancy: fix attribute block assignment for declarations
  * njscroll: multi-range hilites; fade animation for multi-range hilites.
    this is crucial for the ability to hilite modified areas
  * axl: gui subsystem: alpha rects & animation support
  * jancy: disable variant operators
    proper implementation requires more advanced redesign than i assumed
    initially. for member assignments, property address operators, indexation
    etc special new type like TypeKind_VariantRef must be introduced.
    importance/implementation-difficultly ratio is too low
    for now variants will be used for storage only.
  * jancy: eleviate dbl-ptr-size limitation on type size that can be stored in
    Variant; it was really annoying when you couldn't store long literal in
    variant, now it is allowed to store arbitrary sized values (large values
    will be stored as references)
  * jancy: disable tests if jnc_app is not built
  * ioninja: remove no-terminal flag from UDP session -- it will allow
    redirecting from/to UDP sockets
  * jancy: test10 did not zero-terminate memcat-generated buffer (which halted
    address-sanitizer on Mac in printf)
    no need to zero-terminate memcat-buffer automatically -- printf is unsafe,
    anyway
  * jancy: no need to zero memory in StdLib::memCat
  * jancy: force simple GC safe points if we compile with address sanitizer
    hitting GC guard page does not make address sanitizer happy. so just use
    simple GC safe point call if we make a sanitized build
  * axl: add macro to check whether we compile with address sanitizer
  * graco: add pthread to test_cpp
  * jancy: typo TypeKind_Void/ValueKind_Void
  * jancy: add full path to units (otherwise imports may be searched in the
    wrong sequence)
  * axl: io::findFilePath should also check *firstDir before trying (otherwise
    it will effectively search in current dir)
  * jancy: all old tests are added to the test suit
    in the future as during debugging of jancy compiler/runtime problems,
    corresponding test should be added to test/test_jnc folder
  * jancy: invalid function sequence in std.String/std.StringBuilder
  * jancy: HashTable classes didnt' properly mark opaque GC roots
  * jancy: allow multiple typedefs for the same name (as long as type matches)
  * jancy: fix CallConv::getThisArgValue with respect to argument coercion
    (applied to struct/union methods on amd64, both Microsoft x64 and SystemV)
  * jancy: don't erase allocas of lifted variables until the very end (they
    may be already stored in Value-s)
  * FunctionMgr::callStaticConstructor calls LlvmIrBuilder directly
    (OperatorMgr complained about conversion of function-ptr to thin-data-ptr
    in non-unsafe region)
  * jancy: incorrect assert in Value::getFieldOffset
  * jancy: test_qt had incorrect highlighting for dynamiclib
  * jancy: appending char array to fmt-literal should trim zero-termination
    (if any)
  * jancy: sample of disposable pattern in jancy
  * jancy: incorrect assertions in exception-handling  code
  * graco: simple console test for graco cpp back-end (will use it later for
    testing and further development of graco)
  * axl: RagelLexer should check length for -1 (and use strlen)
  * jancy: separate between cross-scope and cross-function landing pads.
    we must restore previous gc shadow stack frame on exception landing pads --
    even when the function has no roots.
  * jancy: major redesign of exception handling and scope escapes
    replace multiple allocas for sjlj-frames with a single re-usable sjlj-frame
    array; also much cleaner implementation for setting the correct sjlj-frame
    via landing-pad-blocks
  * jancy: try expression and try statement; try expression truely catches
    exceptions now (instead of just locking throw-if errorcode handling like
    before)
  * jancy: remove tmp gc root scopes (add tmp roots to user scope)
    this potentially keeps temp objects lingering longer than they are needed,
    but it greatly simplifies everything
  * jancy: when opening user scope frame map we should also update tmp stack
    root frame map insert point
  * jancy: bugfix: tmp gc root insert location was not alwats cleared between
    functions
  * jancy: we must open tmp gc stack root map in the beginning of
    statement/declaration (because of phi-functions)
  * jancy: when opening gc shadow stack frame map we need to zero gc roots
    even when we roots are not re-used (because of loops)
    use corelib function for simplicity
  * jancy: everything compiles, all the tests are passed (but some ioninja
    sessions crash on run)
  * jancy: sjlj struct
  * axl: rename LongJmp -> Sjlj
    also change layout of SjljTry struct (to make it usable from jancy)
  * jancy: initial commit for new exception model.
    new tokens, new grammar, no new code generation logic - yet.
  * ioninja: displaying functions as clickable actions in packet template
    widget
  * axl: AXL_NO_ASAN macro
  * jancy: bugfix: strlen should FIRST check the range, then NULL
    subtle bug, discovered by GCC address sanitizer
  * jancy: bugfix: off-by-one bug in MulticastImpl::removeHandler
  * jancy: bugfix: clear friendset and dual ptr type tuple map in
    Namespace::clear
  * jancy: jnc_sys extension library skeleton
  * jancy: minor fix in jnc_ext_Pch.h (after axl namespace shuffle)
  * axl: minor namespace shuffle (mt:: moved to sys::
    some mt:: members moved to sl::)
  * axl: remove lex-related classes from axl_core and move them to axl_lex lib
  * ioninja: added all standard high-speed baud rates to the serial session
  * jancy: attribute values;  clang-specific issues to be worked out
    pch settings for gcc do not work out-of-the-box
  * ioninja: package script fixes after latest cmake changes
  * bulldozer renamed to graco (grammar-compiler)
  * jancy: disposable pattern (raii replacement)
  * jancy: fixes in samples/02_dialog (compiles & runs)
  * jancy: fixes in samples/01_export (compiles & runs)
  * jancy: bugfix in stack lifting for structs with constructors
  * jancy: re-prime after destruct (may prevent tricky bugs like the previous
    one)
  * jancy: critical: replace MulticastImpl::~MulticastImpl with
    Multicast::destruct. turned out, newer GCC may optimize things out of
    destructors!
  * ioninja: remove debug printfs
  * ioninja: make ioninja compile with or without devmon
  * ioninja: remove devmon inclusions from main ioninja CMakeLists.txt (move
    it to MSI installer project)
  * jancy: also apply --source-name to the first file in list
  * jancy: multiple files can be passed to command-line compiler jancy.exe
  * jancy: cmd line app runs function by default (rather than compile-only)
    some sanity checks for the entry point function type
  * ioninja: compile profiling
  * jancy: always place alloca's in the entry block
    turns out it may cause stack overflow otherwise (alloca's in looped block)
  * jancy: bugfix: array_suffix incorrectly parsed expressions starting with
    integer (because this special "shortcut" rule). shortcut rule removed
  * jancy: check division by zero
  * jancy: anydata pointers
  * ioninja: remove transmit pane size limitations

................................................................................

version 3.5.5 (2016-01-08)

  * ioninja: typo in SerialSession.onParityChanged ()
  * njscroll: bugfix: once record is hidden, it was impossible to un-hide it
    (even if filter were to return true) -- hidden bit was kind of sticky.
  * ioninja: add an option to disable terminal pane for stream sessions (as an
    performance tweak; plus it might also help to isolate problems when crashes
    occur)
  * ioninja: don't emit SerialStatusLineChanged event on
    IOCTL_SERIAL_GET_MODEMSTATUS, insteqd keep track of the latest status line
    and emit event only when some line actually chanes
  * njscroll: critical bugfix: incorrect destruct sequence in CacheMgr
  * ioninja: start log server suspended when opening log file
  * njscroll: support for starting server in suspended state, resume later.
    this is important for opening ioninja logs (before representer is set)
  * ioninja: change shutdown sequence (stop log server IO thread in the
    beginning, but close record file in the very end)
  * njscroll: bugfix: NotifyCode_RebuildCompleted was never issued on amd64,
    resulting in hang-on-log-rebuild
  * ioninja: serial session port prop is now gui.StringProperty (without port
    list suggestion)
  * njscroll: bugfix: incorrect cursor advance when typing at the end of
    hex-pane
  * njscroll: bugfix: incorrect logic for changing console size
  * axl: use CLOCK_REALTIME_COARSE only if it's available (fallback to
    CLOCK_REALTIME otherwise -- older Linuxes don't have CLOCK_REALTIME_COARSE)
  * axl: make libudev optional (use find_path to determine whether libudev is
    installed and choose whether to build AXL wrappers for it).
    sys::lnx::SerialPortEnumerator simply returns a fixed list of devices if
    libudev is not available
  * axl: don't use C++ rtti typeid anymore
  * cmake: make GCC rtti optional and OFF by default
    using RTTI under GCC is really annoying. AXL used RTTI to get nicely
    formatted typenames, however under GCC typeid (T).name () gives a
    mangled name anyway. Even bigger issue is that it's impossible to derive
    from an interface class (with virtual functions) defined in a -fno-rtti
    library (and LLVM uses -fno-rtti by default, so it would require to rebuild
    LLVM with LLVM_REQUIRES_RTTI=1).
  * axl: bugfix: memory leak in cf::TypeRef::getDescription ()

................................................................................

version 3.5.4 (2015-12-31)

  * axl: minor update re moving time functions to axl::sys namespace
  * axl: fsm subsystem is separated into a dedicated lib
  * axl: cf lib (Mac OSX Core Foundation Framework wrappers)
  * axl: iok lib (Mac OSX IOKit Framework wrappers)
  * ioninja: serial enumeration is implemented on Mac (using IOKit)
  * jancy: detect USB serial disconnect io.Serial implementation for POSIX
  * jancy: io_base.jncx should link to libudev
  * axl: sys::lnx::Udev classes
  * axl: sys::lnx::SerialPortEnumerator (via udev)
  * ioninja: terminal scrollback limit implemented (translates to
    Terminal::setHistoryLimit)
  * ioninja: gui.ComboBox.clear () method
  * ioninja: refresh com port list in both Serial and SerialMon sessions
  * ioninja: handling IoError in SerialSession (especially important during USB
    serial ports surprise removal)
  * ioninja: log error format change: (error-desc) -> : error-desc
  * njscroll: TerminalWidget history limit implemented
  * jancy: IoError event for various IO classes (particularly important for
    USB serial ports)
  * jancy: FileStream overlapped bugfix (potential lost of read blocks)
  * axl: serial port enumerator
  * njscroll: bugfix in TerminalWidget: terminal could crashed on invalid
    input due to unverified escRestoreCursor

................................................................................

version 3.5.2 (2015-12-21)

  * ioninja: bugfix: File->Exit caused a hang
  * ioninja: dock state persistency fix
  * ioninja: font family should not be altered if it's not set properly
  * jancy: first add library, then do forcedExport
  * jancy: forcedExport did not check for addImport result
  * ioninja: mac dmg installer background image update
  * ioninja: update nj_io_mon to reflect the latest jancy change (.jncx is now
    .zip)
  * jancy: extension lib redesign: .jncx is now a .zip archive with .jnc
    source files and .bin dynamic library
  * axl: io::getTempDir
  * ioninja: add /d switch when signing installer (otherwise UAC displays some
    random tmp file name)
  * devmon: MSI installer fixes (did not work with UAC on)
  * axl: bugfix in AccessToken::getTokenInformation
  * jancy: remove jncx-info -- .jncx file is going to be a .zip archive
  * ioninja: installer can now execute nested MSIs
  * axl: zip read support (library axl_zip, class axl::zip::ZipReader)
  * ioninja: bugfix: installer did not ask to install Device Monitor if
    WinPcap feature was not selected
  * ioninja: rephrased installer message "XX-bit version already installed"
  * devmon: check for admin rights before admin-sensitive operations
  * devmon: update removeAllPnpFilters to ignore devices with no physical name
    (yes, it might happen in win10)
  * axl: simple access token wrappers
  * axl: sid wrappers
  * ioninja: proper handling of SSH re-authentification (need to reconnect
    when user name changes)
  * ioninja: appearance settings (fonts & colors)
  * njscroll: bugfix: icon placement was calculated incorrectly
  * njscroll: also, icon placement must be updated upon font change.
  * njscroll: critical bugfix: fold record should nullify current line
  * ioninja: bugfix: Serial was using wrong settings on open (should use combo
    boxes, not properties)
  * ioninja: zip package on windows changed to 7z
  * ioninja: mac packages (tar & dmg)
  * unix tar packages now use xz compression
  * ioninja: mac app bundle support
  * jancy: bugfix: jancy.exe crashed on --help command line switch
    (--import-dir had missing value)
  * ioninja: bug fix: session menu was created too late (caused an occasional
    crash)
  * bugfix: QT toolbar buttons had background on MacOS X

................................................................................

version 3.5.1 (2015-11-24)

  * ioninja: session link re-implemented (via dedicated Session Link dialog)

................................................................................

version 3.5.0 (2015-11-20)

  introduces: Jancy dynamic extensions (.jncx); Jancy multi-line literals;
  new Tibbo Device Monitor service for Windows with support for early attach
  to PNP devices; Serial Monitor plugin uses new Tibbo Device Monitor; Jancy
  compiles and runs on Mac OSX;

  * jancy: io::Socket::open did not translate io::AddressFamily_Ip6 to AF_INET6
  * jancy: io::SshChannel did not report libssh2 errors properly (should use
    libssh2_session_last_error)
  * ioninja: hex-view & plain-text icons resized to 20x20
  * all: port to MaxOSX
  * jancy: critical bugfix: using _alloca to determine stack epoch is not safe.
    turned out under certain conditions the first _alloca was above subsequent
    _alloca's (initializeThread () also uses up some stack). so we better use
    ExceptionRecordSnapshot pointer on stack, which is guaranteed to be above
    any subsequent stack allocations.
  * all: add -fPIC to all libraries. on amd64 gcc refuses to build shared
    objects unless all used static libraries are compiled with -fPIC. so, let's
    add -fPIC to all static libraries (libssh2/openssl for amd64 were also
    rebuilt with -fPIC)
  * ioninja: include .jncx extensions into deb & rpm package
  * ioninja: don't automatically add scipts/api to import path (rather, use
    paths.conf -- it's more consistent and more flexible)
  * ioninja: if server process terminates normally, just wait (rather than
    abruptly cancel pending requests -- this might result in losing compile
    error messages)
  * axl: allow read from SharedMemoryTransport even after remote disconnect
  * ioninja: add io_base.jncx. io_pcap.jncx and io_ssh.jncx to tar package
  * ioninja: premature termination of ioninja-server should report some error
    (before it was "no error")
  * ioninja: . in paths.conf should refer to conf dir, not to bin dir
  * axl: no need to have pvoid_cast (int) specialization on gcc
  * all: Version.h.in -> version.h.in
  * ioninja: msi and zip packages include tdevmon.msi and extensions:
    io_base.jncx , io_pcap.jncx, io_ssh.jncx, io_pcap.jncx
  * devmon: disable damn OACR in wdk build
  * ioninja: serialmon bugfix (m_dataSize was not set)
  * ioninja: SrvLib was not really added to module (printf/trace were not
    linked properly)
  * ioninja: serialmon had missing JNC_BEGIN_CALL_SITE around jnc::rt::memDup
    also, it's necessary to protect m_eventParamArray against race conditions
    in enumOpaqueGcRoots (we use JNC_BEGIN_CALL_SITE for that)
  * sh: devmon added to build scripts
  * ioninja: switch from old tdevmon to new tdevmon
  * ioninja: error propagation in shared extension lib nj_io_mon.jncx
  * jancy: error propagation in shared extension libraries io_*.jncx
  * devmon: cmake prefix change: DM_xxx -> DEVMON_xxx
  * axl: err::ErrorHdr& -> err::ErrorHdr*
  * devmon: forced stop support (for uninstall/reinstall). in case safe stop
    is not possible, service is still stopped (but the driver actually remains
    in memory in limbo state (reboot is required)
  * devmon: prevent unsafe filter device stoppage even in debug build
    (otherwise it's difficult to test release-expected behaviour)
  * devmon: critical bugfix in FilterDevice_dispatchCreate: caused a BSOD for
    non-exclusive devices.
  * devmon: msi package executes tdevmon.exe to perform necessary service
    actions (create, start, stop etc)
  * all: version.h.in VERSION_FULL is now defined as MAKELONG (MAKEWORD
    (VERSION_REVISION, VERSION_MINOR), VERSION_MAJOR)
    this is to allow specifying version in a natural way (2 hex digits for each
    version part, e.g.: 0x10203 --> 1.2.3)
  * devmon: critical bugfix: m_exclusiveFileCount did not account for initial
    ObDereferenceObject
  * axl: class sys::win::Process; sys::win::syncExec ()
  * devmon: MSI package prototype
  * devmon: driver signing (now that the new Tibbo code-sigining installed)
  * devmon: listing devices (all or devices of specified class)
  * devmon: getting device info
  * devmon: installing/removing PNP filters using physical device name or device
    class
  * devmon: removing PNP filters for all devices
  * axl: support for enumerators in sys::win::DeviceInfo
  * devmon: starting and stopping core service should also update service start
    type
  * devmon: stats for PNP beacon device
  * devmon: proper propagation of DeviceType and DeviceCharacteristics in both
    FilterDevice and PnpDevice.
  * devmon: major update: support for early pnp device attach via pnp filter
    driver tdevmonp.sys
  * axl: setupapi wrappers (sys::win::DeviceInfo)
  * axl: better overlapped IO support in io::win::File/io::win::FileHandle
  * devmon: application displays driver version, description and build time
  * devmon: all the binary data of read/write/ioctl requests is displayed in
    hex-view
  * devmon: supports for driver description, build time and asynchronous reads
    in client library
  * devmon: build driver with cmake (invokes WDK build as custom command)
  * devmon: handle IRP_MJ_INTERNAL_DEVICE_CONTROL
  * devmon: don't copy extra bytes besides the header on
    ntm_NotifyFlag_InsufficientBuffer
  * devmon: provide information on driver description and build time
  * axl: mt::win::WaitableTimer
  * devmon: initial release of the new device monitor (driver, library and
    application)
  * cmake: WDK support
  * ioninja: old njdm (device monitor) is removed
  * axl: sys::win::Service/ServiceMgr wrappers for SCM
  * jancy: multi-line literals
  * enumeration of source files in extension libraries.
  * axl: mt::DynamicLibrary method renames (load -> open; release -> close)
  * axl: add pvoid_cast specialization for int (othersize it was impossible to
    use pvoid_cast (NULL) on 64-bit systems)
  * ioninja: remove lib-prefix from jancy extension io_mon.jncx
  * jancy: remove lib-prefix from jancy extensions io_base, io_pcap, io_ssh
  * axl: remove extern "C" from AXL_EXPORT macro (must specify it explicitly)
  * ioninja: link jnc.stdLib explicitly
  * jancy: stdLib must be linked explicitly due to the link-order importance
  * jancy: llvm tag decoration bugfix.
  * ioninja: migration to the new jancy extension model
  * jancy: jnc::rt::RuntimeRef -> jnc::rt::Runtime (opaque in shared
    extensions)
  * jancy: jnc2cpp.pl is made public
  * jancy: minor bugfixes in jnc_io_base jnc sources.
  * jancy: major extension framework redesign; now suitable for shared
    libraries as well.
  * axl: rtl->sl (bad naming, besides, rtl is now used in jancy lib, and there
    it really means run-time-support-lib)
  * jancy: extension framework is somewhat functional
  * axl: bugfix in rtl::StringSlice::isEmpty
  * axl: GUID_Xxx -> g_xxxGuid
  * axl: minor improvements in rtl::StringCache
  * axl: rtl::BoxList::copy ()
  * axl: rtl::StringSlice

................................................................................

version 3.4.11 (2015-09-25)

  * ioninja: save-session and load-session are functional
  * njscroll: better to make renameRecordFile copy the file (on Windows it's
    not possible to remove FILE_FLAG_DELETE_ON_CLOSE flag unless using
    undocumented methods)
  * bugfix: io::MappedFile::write did not update m_fileSize.
  * ioninja: remove unlink for CmdLineFlag_TmpLogFile (now it's done
    automatically in njs::Server
  * njscroll: support for io::FileFlag_DeleteOnClose (also on POSIX)
  * njscroll: extra file flags argument for rename record file method
  * njscroll: support for layer removal
  * support for record file renaming
  * njscroll: njs::LayerMgr::removeLayer ()
  * axl: io.renameFile (), io::copyFile (), io::deleteFile ()
  * axl: io::MappedFile::write method (uses io::File::writeAt)


................................................................................

version 3.4.10 (2015-09-23)

  * ioninja: serial session: all serial settings are available via toolbar
    combo boxes
  * ioninja: pass plugin and log settings via temporary files during document
    creation
  * njscroll: additional BinDataConfig argument in njs::Server::create ()
  * ioninja: bugfix: gui::ComboBox::setCurrentIndex did not update value field
    m_currentIndex
  * axl: io.TemporaryFile (on windows uses FileFlag_DeleteOnClose, on POSIX
    deletes file in destructor)
  * ioninja: setting for gc-safe-point method (write-barrier vs simple-call)
  * jancy: support for simple gc-safe-points via call (rather than write
    barrier). write barrier safe points are not currently possible on win64
    because SEH 64 relies on being able to walk the call stack, and it doesnt
    work with llvm-jitted functions
  * jancy: critical bugfix in linux garbage collector
  * jancy: system V on amd64 incorrectly passed 128-bit structures
  * ioninja: support for redirecting of dbg::trace to ioninja-server-log
  * axl: support for redirection of dbg::trace to a file
  * axl: io::SharedMemoryTransport uses io::Mapping directly (without the
    overhead of io::MappedFile)

................................................................................

version 3.4.9 (2015-09-16)

  * jancy: critical bugfix: crash on windows 10 due to different base address
    of ntdll.dll (__chkstk was too far, more than 4GB away from the generated
    code, therefore relative call was not possible)

................................................................................

version 3.4.8 (2015-09-14)

  introduces: new Jancy pointer safety model; new Jancy garbage collector
  implementation; support for retro-colorization in Ninja Scroll engine;
  Syntax Highlighter plugin wizard in IO Ninja; new setting UI in IO Ninja

  * ioninja: apply method for Jancy Settings page
  * ioninja: set acceleration=true for large-value spin-boxes
  * jancy: setters for stack size limit, gc heap size trigger and gc period
    size trigger
  * ioninja: Colorizer plugin wizard is now called Syntax Highlighter plugin
    wizard; by default it generates a full C-language syntax highlighter
    including keywords, comments, and literals.
  * jancy: bugfix: accessing autoget property field of parent class did not
    work
  * jancy: improvement: allow non-closure-aware function ptr casts
  * jancy: jnc.AutomatonFunc typedef
  * jancy: function ptr type should update its signature on calc-layout.
  * jancy: minor bugfix in qt_test syntax highlighters
  * jancy: remove pseudo-chars ^/$ from jnc.Recognizer
  * axl: remove pseudo-chars ^/$ from FSM (was not an efficient implementation
    anyway)
  * ioninja: serial mon session now has filters for serial setting changes,
    serial control line changes, serial status line changes.
  * ioninja: show session settings by default when a session is open
  * jancy: JNC_END_CALL_SITE should only leave no collect region if no
    exception happened (otherwise gc shadow stack might contain invalid entries
    which will lead to crash)
  * ioninja: colorizer plugin wizard
  * ioninja: bugfix: protocol analyzer wizard used incorrect automaton
    declaration
  * njscroll: retro-colorize should redraw all the affected lines (previously
    only the last line was redrawn)
  * ioninja: colorization of protocol headers in network sniffer
  * ioninja: retro-colorize support
  * jancy: support for line continuation sequences in regexp literals
  * axl: support for line continuation sequences in FSM compiler
  * njscroll: bugfix: retro-colorize should drop
    CacheBinLineFlag_FinalAttrArrayReady
  * jancy: bugfixes in jnc.Recognizer: updating currentOffset should
    synchronously update lexemeOffset and currentOffset
  * jancy: changing lexemeLengthLimit didn't update lexeme buffer accordingly
  * njscroll: retro-colorization support
  * njscroll: bugfix: addPartBuffer did not properly update longest line
    length if lines were unmerged
  * njscroll: RepresenterTarget::writeRecord for strings.
  * ioninja: toolbar button binary data view switch
  * ioninja: critical bugfix: call-function-in-worker-thread req entry must be
    removed INSIDE jancy call site -- otherwise FunctionPtr might be deleted
    during gc-mark
  * ioninja: rebuild log progress dialog
  * ioninja: critical bugfix in all io-related classes: waiting functions
    should be enclosed in gc-wait regions (deadlocks otherwise)
  * ioninja: bugfixes in dialog classes construction
  * njscroll: rebuild log progress notifications
  * njscroll: remove half-impltemented colorizer architecture
  * jancy: JANCY_CALL_SITE_FINALLY
  * axl: AXL_MT_LONG_JMP_FINALLY
  * ioninja: bump up the size of setting dialog
  * ioninja: under kubuntu page area of setting dialog was too small to
    accomodate the minimum size of some pages
  * jancy: bugfixes in jnc::callFunction/jnc::callFunctionPtr
  * axl: remove mulDiv64 -- (bad performance and non-amd64 compatible); use
    simpler and faster approach with cast-to-double.
  * ioninja: jancy settings page is functional
  * ioninja: gc trigger sizes/stack limit size are being passed in command line
    and in setJancySettings msg
  * ioninja: gc stats is being collected by ioninja-server and displayed on
    jancy  settings page.
  * jancy: gc alloc size trigger
  * jancy: gc stats is available.
  * njscroll: use axl::g::getPreciseTimestamp for log record timestamps and
    for profiling
  * axl: critical bugfix re timestamps on windows: now there are
    axl::g::getTimestamp () using GetSystemTimeAsFileTime and
    axl::g::getPreciseTimestamp () using QPC
  * ioninja: no need to unparent property widget in ~SettingDlg
  * ioninja: major update: new settings dialog
  * ioninja: all objects created by layers now consolidated and can be removed
    all together
  * ioninja: remove-layer and remove-all-layers are functional
  * jancy: markOpaqueGcRoots func should be a member function rather than
    static
  * jancy: improvement/simplification in weak function/property pointers: weak
    mask is gone -- only 'this' arg can be made weak
  * jancy: no weakening-operator is required now
  * jancy: scheduled function pointers are properly weak-traced now.
  * ioninja: better design for main thread scheduler (as dedicated opaque
    class)
  * jancy: add TypeFlag_GcRoot if class type has mark opaque gc roots func
  * ioninja: major redesign: each plugin has its own runtime (now it's
    possible to remove plugins one-by-one)
  * jancy: jnc::construct/jnc::destruct moved to axl
  * jancy: rename JNC_BEGIN/JNC_END to JNC_BEGIN_CALL_SITE/JNC_END_CALL_SITE
  * jancy: JNC_BEGIN_CALL_SITE_NO_COLLECT for creating non-collectible call
    sites
  * jancy: support for direct function calls (when already inside call site)
  * axl: memory allocation and ref-counting model redesign:
  * axl: factories are gone (were poorly designed anyway)
  * axl: support for easy switching of base allocator
  * axl: support for constructor arguments (!)
  * axl: switch from explicit destruct function pointer to virtual destructor
    in RefCount
  * axl: decrease of size for child and in-place RefCount objects
  * ioninja: minor api redesign: use opaque class fields instead of pointers
    wherever possible (before it was impossible to instantiate opaque classes
    as variables or fields)
  * ioninja: remove FileDlg, LoginDlg etc dialogs from plugin host (should be
    created by plugins as needed)
  * jancy: bugfix: reactor layout could not be calculated due to the bug in
    lookupIdentifierType -- variable or field always yielded DataRef (for
    classes should be ClassRef)
  * jancy: ApiBase <T> --> ApiBaseTailPadding <T>; this is to allow arguments
    in base constructors.
  * ioninja: don't allocate log on gc-heap (it's static anyway)
  * jancy: critical bugfix: new (p) T () -> new (p) T
  * jancy: prevent zero-initializing already-primed headers
  * jancy: allocate large structs/unions/arrays directly on the gc-heap
  * jancy: minor bugfix: in multi-declarator declarations with implicit storage
    specifier, the first deduced storage specifier was used for all the other
    declarators (without re-evaluation)
  * ioninja: bugfixes and updates re io object on POSIX
  * jancy: bugfixes and updates re GC on POSIX
  * axl: mt.atomic functions for size_t on POSIX
  * ioninja: minor bugfix in io.Ssh: 64-bit size_t <-> int cast
  * ioninja: prevent unnecessary setError in Ssh::write ()
  * ioninja: major cleanup of api prime/construct calls
  * jancy: ApiClassBox is gone; ClassBox does not implicitly call constructor
  * ioninja: major update of all the API re latest jancy change in opaque
    classes design
  * jancy: major opaque class redesign: allow deriving from opaque classes,
    allocation as variables or fields etc -- basically, opaque classes are now
    just like normal classes but with opaque padding. 'operator new' is gone.
  * axl: minor StringCache bugfixes
  * jancy: bugfix: variable declaration for non-creatable types caused a crash
  * ioninja: bugfix: exception in log representer caused in 'result' being
    used without initialization
  * ioninja: critical bugfix: jancy exception in plugin constructor lead to
    deadlock (mutator thread has been not unregistered)
  * jancy: callFunction uses new axl-mt-long-jmp-try
  * jancy: JNC_END_EX returns status (so JNC_CATCH can be in many cases omitted)
  * jancy: more strict checks on ExceptionRecoverySnapshot.
  * axl: long-jmp-try can now return status via AXL_MT_END_LONG_JMP_TRY_EX (so
    AXL_MT_LONG_JMP_CATCH can be in many cases omitted)
  * jancy: exception recovery snapshots
  * jancy: handle destructor exceptions individually.
  * ioninja: remove debug printf's from io_PCapDeviceUi.jnc
  * jancy: memory leak in jnc.StringHashTable and jnc.VariantHashTable
  * ioninja: bugfix: no collect regions in Serial::fireSerialEvent and
    PCap::firePCapEvent
  * jancy: major update: multicasts & snapshots now use gc heap only instead
    of malloc/free (in-destructors)
  * ioninja: bugfix: serial log had skipped trailing argument in formatting
    literal
  * jancy: disallow argument skipping in formatting literals
  * jancy: formatting literal improvements: remove special gc handling (use
    fat pointer instead)
  * jancy: check for unused formatting literal arguments
  * axl: minor fix re io.UsbDevice on amd64
  * jancy: optimized method addRootArray for adding continual regions of roots
  * ioninja: major update of all api implementation classes re latest jancy
    changes
  * jancy: majort redesign of garbage collector and pointer-related structures
  * axl: minor update of mem-tracker report format
  * jancy: allow nested JNC_BEGIN-s (keep thread init count in tls)
  * ioninja: all the plugins compile
  * jancy: markStackGcRoot accepts target scope
  * jancy: StdFunction_CreateDataPtrValidator
  * jancy: jnc.memDup
  * jancy: LeanDataPtrValidator from class ptr
  * jancy: create reactor bindsite variables in entry block
  * ioninja: minor serial log colorization fix
  * axl: io.UsbDevice cleanup of 64-bit incompatibilities

................................................................................

version 3.4.7 (2015-09-07)

  * axl: undo broken QPC implementation of timestamps

................................................................................

version 3.4.6 (2015-07-16)

  * ioninja: devmon32 caused crash on installation -- replaced with the stable
    one from ioninja-2.3.5
  * ioninja: minor serial log colorization fix
  * axl: io.UsbDevice cleanup of 64-bit incompatibilities
  * changelog: force re-generation of changelog.txt every time
  * axl: err::SystemErrorCode_ObjectNameNotFound->ENOINT
  * axl: minor bugfix in hex-encoding
  * jancy: support for binary numbers and binary-literals (token is still
    called HexLiteral -- it yields the same results in all regards)
  * axl: improvements in libusb support; extended test for libusb enumeration
  * axl: minor update in ref::Buf (use pointers instead of references)
  * jancy: bugfix: formatting literals did not handle int64/uint64 properly
  * axl: high-resolution timestamps on windows (GetSystemFileAsFileTime proved
    to be way imprecise)

................................................................................

version 3.4.5 (2015-06-23)

  * ioninja: bugfixes in scripts (re moving network adapter UI from API to
    common)
  * ioninja: updates re IP-defragmentation in all pcap-based plugins (Network
    Sniffer, TCP Flow Mon, UDP Flow Mon)
  * jancy: bugfix: deleteUnreachableBlocks used llvm::Value::hasOneUse () while
    it should have used llvm::Value::use_empty ()
  * jancy: bugfix: logical or/and should promote reachability flag BEFORE
    compiling the second operand.
  * jancy: bugfix: struct/union member functions did not work (due to
    incorrect lean this-pointer)
  * jancy: bugfix: locally declared named types did not work (due to missing
    calc-layout)
  * ioninja: tcp-flow-mon, udp-flow-mon plugin updates
  * ioninja: hide "add new layer" button (not relevant now)
  * ioninja: gui.ComboBox crashed on addEditTextToHistory with null-string
  * ioninja: io.PCap.openFile
  * ioninja: ip4 header fragmentation fields
  * axl: io::parseSocketAddress with empty string now yields zero'ed ip4
  * axl: io::PCap::openFile
  * jancy: jnc.List class
  * jancy: jnc.StringHashTable, jnc.VariantHashTable
  * jancy: bigendian bitfield support
  * ioninja: context menus for hex-edit & terminal widgets
  * bugfix in context menu (mouse-drag was not released)
  * njscroll: improvements in undo/redo: sanity checks, clear/setData/writeData
    registers with transaction history, caret update post setData/clear
  * njscroll: undo/redo in hex-edit widget
  * njscroll: select word on double-click
  * axl: don't disply 0.0.0.0 when formatting IPv4 address (display port only)
  * ioninja: Displaying update error message in About dialog in a single line.
  * ioninja: Displaying error description in About dialog when update fails.

................................................................................

version 3.4.4 (2015-06-08)

  * ioninja: bugfix: test code in MainWindow::onHelpAbout caused a crash
  * ioninja: update session to reflect recent jancy change re dynamic
    sizeof/dynamic countof
  * ioninja: serial session improvements
  * ioninja: gui.ComboBox.adjustSizeToContents method
  * jancy: dynamic sizeof/dynamic countof now require pointers rather than
    references
  * ioninja: serial: only report when current value is different from the
    previously reported one
  * jancy: bugfix: variantRelationalOperator did not work
  * njscroll: timestamp visibility setting (never, smart, verbose)
  * njscroll: add CursorFlag_EnsureVisible when setting cursor on mouse move
    (very useful when selecting data in big log so it's possible to jerk mouse
    around to scroll)
  * axl: force english for windows error description (otherwise it causes
    problems with chinese windows and njscroll log engine)
  * ioninja: change log update, website update
  * ioninja: rollback defaults of auto-convert single lf/single cr to lf/cr
    pair to FALSE (just wasted almost an hour trying to figure out why mc
    doesn't work in ssh session)
  * njscroll: bugfix: xterm saved cursor and caret attr should be part of
    screen buffer
  * njscroll: bugfix: invalid bin line size was used in cache processors (bug
    introduced with recent changes in unicode drawing)

................................................................................

version 3.4.3 (2015-06-01)

  introduces: TCP Flow Monitor, UDP Flow Monitor, proper display of unicode
  characters spanning across line borders, member operator for jancy enums

  * axl: release 5.3.7
  * jancy: release 1.5.5
  * ioninja: rollback defaults of auto-convert single lf/single cr to lf/cr
    pair to FALSE
  * njscroll: bugfix: xterm saved cursor and caret attr should be part of
    screen buffer
  * njscroll: bugfix: invalid bin line size was used in cache processors (bug
    introduced with recent changes in unicode drawing)
  * jancy: adjust function tag of std functions memcpy, memset, strlen etc as
    to avoid mapping conflicts
  * jancy: use zeroInitialize rather than store for stack variables
  * jancy: add memset, memcpy, memmove to global mapping (required by llvm
    intrinsics)
  * jancy: bugfix: getMemberOperatorResultType () and memberOperator () should
    use OpFlag_KeepEnum when preparing operand (now that we have enum member
    operators for simplified enum value checking)
  * jancy: remove explicit cast requirement for integer truncations (it's
    really annoying)
  * ioninja: tcp-flow-mon explicit cast size_t->uint32_t
  * jancy: bugfix: using enum constants from within the same enum caused
    calc-layout recursion error
  * jancy: bugfix: deleteUnreachableBlocks might have lead to situation when
    block is marked unreachable but still had uses. changed to a fixed-point
    computation to delete unreachable blocks in proper order
  * jancy: llvm.memcpy, llvm.memset, llvm.memmove
  * zero-initialize large variables with llvm.memset (rather than store)
  * jancy: member operator for enums (allows skip writing fully-qualifed
    member names when you need to check the value of a enum variable/field)
  * ioninja: tcp flow monitor/udp flow monitor icons from leo
  * ioninja: change the size of buffer back to 1600 (apparently, windows does
    not reassemble IP-fragmented datagrams, so it doesn't really matter)
  * added minhook library and test (for api hooking in ioninja)
  * cmake: create_flag_setting improvements: modify both C and C++ flags
  * automatically detect configuration-independent/configuration-specific
    flags.
  * ioninja: change min/max packet size limits to 0..65536
  * ioninja: tcp flow mon session: support for out-of-order TCP segments
  * ioninja: udp session: read buffer should be 65535
  * udp flow mon sessions: read buffer should be 1600 (no IP fragmentation
    supported yet)
  * ioninja: bugfix: sniffer session did not handle invalid UDP/TCP sizes
    properly
  * ethernet frame buffer was too small (should be 1600)
  * ioninja: filter combo in sniffer
  * bugfix in tcp flow mon
  * ioninja: re-arrange plugin groups (UDP is now client, TCP proxy is now
    server)
  * axl: io::SockAddr::parse also accepts single port string (results in IPv4
    with zero-ed address)
  * ioninja: UDP flow monitor
  * axl: bugfix: rtl::String::insertSpace did not work properly on libc
    (memcpy vs memmove)
  * ioninja: TCP flow monitor (uses pcap to build clean TCP data flow log)
  * axl: SockAddr utils for equality checking and filter matching
  * ioninja: clean-up of test code in ioninja-server
  * ioninja: support for job objects (turns out to be unreliable and have *a
    lot* of corner cases)
  * support for waiting for parent object, so any of the following will
    terminate server process: 1) disconnect message or 2) shared-memory
    transport disconnect or 3) parent process finished
  * axl: mt::win::JobObject wrapper
  * ioninja: prevent windows crash & send report dialog when ioninja-server
    crashes
  * ioninja: remove windows-vs-linux closeKind configuration (always use
    SO_LINGER)
  * axl: test_mini simple socket test re graceful close/reset
  * ioninja: bugfix: doc.Storage incorrectly saved empty strings (as '(null)'
    values)
  * ioninja: --root flag was ignored
  * ioninja: sniffer session should use device name if description is null
  * jancy: strdup should return null for empty strings
  * ioninja: bugfix: socket property disconnectKind (graceful/reset) did not
    work
  * ioninja: disconnect message (rather than waiting for stdin to be closed)
    reading stdin interferes with the new design of gdb debugging
  * ioninja: major redesign of debugger interface: instead of initially
    staring ioninja-server in suspended state to give gdb a chance to attach
    and resume it later, we now start gdb directly. communication with gdb is
    supposed to be done via TCP port passed in a command line (e.g. -d=1234).
  * njscroll: pending cursor validation (when we set cursor into an un-cached
    area)
  * njscroll: don't scroll to bottom on resize unless the vertical scroll bar
    is maxed (before it was cursor based, which was really annoying)
  * njscroll: bugfix in CacheBinHexLine::addBinData: now we need to manually
    check if the line is full (and if yes, then try to fill extra utf bytes)
  * njscroll: let BinLine decide the size of accepted chunk (bin hex lines did
    that outside of addBinData, which now is wrong cause we want to save extra
    bytes past end-of-line for better UTF display)
  * njscroll: save up to 3 extra bytes in bin-hex lines (may help with proper
    UTF display)
  * ioninja: add changelog to windows packages zip/msi
  * ioninja: changelog
  * jancy: major bugfix: const 64-bit integer arithmetics used 32-bit
    operations (potentially resulting in garbage in high bits of results)
  * axl/njscroll: update in unicode bintext painting: use buffer past
    end-of-line (if available) to correctly display characters which are
    encoded acroll line boundaries
  * ioninja: CMakeLists.txt had qt rpath-link added twice (removed old one)
  * cmake: remove rpath when compiling release unix binaries
  * that also requires manually adding rpath-link (otherwise linker failes
  * to build qt-dependent binaries)
  * axl: warning suppression for gcc64
  * ioninja: debian package depends field
  * debian dependency calc perl script

................................................................................

version 3.4.2 (2015-05-13)

  * don't try to display utf combining marks in hex-view and hex-editor (it
    turns into a mess anyways)
  * bugfix: merge threshold didnt work as expected (milliseconds were
    not converted to 100-nanoseconds)
  * bugfixes re suspended/resume states under linux
  * bugfix: removing packet template crashed ninja
  * 3 extra std log record codes (plain text, hyper text, bin)
  * msvc redistributables were not included in zip packages
  * jancy: critical bugfix in checkVariantScopeLevel re TypeFlag_StructRet

................................................................................

version 3.4.1 (2015-05-06)

  * jancy: critical bugfix: gc root variables should be zero-initialized even
    if they have initializer (cause initializer can induce gc-run)
  * jancy: critical bugfix: variant should have TypeFlag_StructRet (otherwise
    it results in invalid argument/retval ABI)

................................................................................

version 3.4.0 (2015-05-05)

  introduces: IPv6 support, named regexps and standard character classes in
  automatons, variants, dynamic library access, SSH session re-authentication,
  x-term changeable terminal console size

  * bugfix: scripts did not compile under x64 due to size_t->int cast (made
    cast explicit)
  * jancy: critical bugfix in gc (due to typo destructGuards of other threads
    were not marked)
  * jancy: null default for automatonFunc in jnc.Recognizer constructor
  * remove extra space from labels like "Address: " (now toolbar injects space
    widgets)
  * minor updates/bugfixes in jnc.Recognizer
  * jancy: bugfix: member automatons produced compile error (did not take
    'this' into account)
  * axl bugfix: RegExpCompiler skipped repeat-char after ')'
  * jancy: recognizer samples updates
  * jancy: update re new regexp engine: AutomatonResult type (to distinguish
    between error and stop)
  * support for named regexp definitions in automatons
  * major regexp engine improvements: support for ^ $ anchors
  * support for std char classes \w \W \s \S \d \D \h \H
  * tcp plugin, ssh plugin -- minor updates in log record logic
  * size hints for toolbar combo boxes
  * forced spacings before toolbar labels and combo boxes
  * network adapter properties update in all plugins
  * AF_INET and AF_INET6 constants are exported into script namespaces
    (AF_INET6 is platform-dependent)
  * jancy: support for export of constants into script namespace
  * change 'debug-info' switch to 'debug'
  * jancy: bugfix: debug info for variant type
  * IPv6 support
  * IPv6 support updates: socket fixes, host name resolving, network
    adapter enumeration
  * adjust property grid drop-down width using QComboBox::sizeHint
  * linux fixes re latest socket changes
  * struct SockAddr as union of sockaddr_in and sockaddr_in6
  * replace all out args of type sockaddr* with SockAddr* (preparation for IPv6
    support in ninja)
  * network adapter enumeration
  * comply with WSAAddressToStringA on windows (or with inet_ntop otherwise)
  * IPv6 parsing and formatting linux fixes
  * IPv6 address parsing and formatting
  * jancy: check variant scope levels
  * throw long-jmp exceptions if library function is called from within
    non-throwing scope
  * check pointer should either soft-throw or long-jmp-throw (ignore try
    operators)
  * full-clear runtime in Runtime::destroy (caused crashes)
  * mt.win.Library fixes
  * remove duplicate strings in dynamic library error messages
  * jnc.Library uses axl.DynamicLibrary, works on Windows and POSIX
  * mt.DynamicLibrary class
  * update tar-building scripts to remove '.'
  * jancy: major update: unsafe functions, unsafe regions, dynamic libraries
  * jancy: declarator syntax update (so it's possible to use 'throws' and
    'const' modifiers in any sequence)
  * SSH channel improvements: re-authenticate, console size change handling
  * jancy: std function jnc.throw ()
  * jancy: bugfix: cast from variant did not handle null variant
  * gui.LoginDlg, gui.MessageDlg
  * remove 'object' (use 'class' instead) and 'object <T>' (use
    'variant' instead)
  * jancy: variant relational operator (at runtime)
  * jancy: allow casts non-POD* --> POD thin*
  * jancy: make variants, structs, unions and arrays nullable (assigning null
    means zero-initialize)

................................................................................

version 3.3.3 (2015-03-31)

  * bugfix: crash during binary transmit page destruction due to incorrect
    destruct order
  * enforce min and max sizes in HexEditWidget::setData
  * bugfix: unexpected jump to the next location when opening find dialog
    with something selected in log
  * bugfix: memory leak fix in Array::reserve
  * find dialog improvements
  * support for copying into string/array rather than clipboard
  * bugfix in property factory (properties were not deleted)
  * re-organize packet template widget
  * only update properties within modification range
  * hex edit widget dataChanged event now contains info about modified range
  * jancy: variant support in formatting literals
  * jancy: variant type basic functionality implemented
  * jancy: remove jnc_VariantType.h
  * typo in copy/paste/undo/redo shortcut handling
  * bugfix: packages did not include packets.conf

................................................................................

version 3.3.2 (2015-03-16)

  * jancy: increase default stack limit (turned out jancy dialog sample failed
    with stack overflow on amd64)
  * axl: support for catchless long-jmp try
  * jancy: c++ exceptions replaced with long_jmp-based exceptions
  * axl: long_jmp-based exceptions (jancy: hard-throws do not work well with
    c++ exceptions)
  * cmake: fix CMP0043 warnings on newer CMake versions
  * jancy: critical bugfix in pointer arithmetics: increment of fat pointer
    was broken after pointer struct unification
  * jancy: remove thin-vs-fat varieties of check-ptr functions (doesn't work
    well under x64)
  * support for post-compile LLVM IR emission
  * jancy: namespace stack should also contain scope field (otherwise
    evaluateAlias nullifies current scope -- it opens namespace, in which alias
    was declared)
  * jancy: should also null-check class pointers before accessing vtable
  * jancy: property ptr vtable loads should add PtrTypeFlag_Safe to function
    pointers
  * jancy: all vtable entries should have PtrTypeFlag_Safe
  * jancy: also null-check thin function and property ptrs
  * jancy: null ptr checks use soft-throws if possible
  * jancy: function ptr and property ptr structs are the same for all pointers
    (cast is done at pointer access)
  * jancy: data ptr range checks use soft-throws if possible
  * jancy: data pointer struct is now the same for all pointers (cast is done
    at pointer access rather than pointer check)
  * jancy: prevent throw loops (catch label marks scope as non-catching)

................................................................................

version 3.3.1 (2015-03-06)

  * important bugfixes in automaton functions
  * IDE plugin wizard updates
  * support for hex-code escape sequence in regexp \x00
  * DFA should use accept context of the NFA state with the lowest ID

................................................................................

version 3.3.0 (2015-03-04)

  introduces: automatons and recognizers, IDE wizards, import facilities

  * recognizers and automaton functions
  * IDE plugin wizards updates re automaton functions
  * IDE session plugin wizard is functional
  * bugfix: API slot conflicts
  * doc.Plugin.transmitString method
  * log.Writer should be allocated on heap, not on stack
  * jancy: std functions: strcat, strdup, memdup
  * bugfix: conflict between std api slots vs user api slots
  * jancy: bugfix: member automatons did not account for 'this' argument
  * jancy: minor update in comments in recognizer sample
  * jancy: test sequence fix
  * jancy: minor gcc fixes
  * jancy: bugfix in CallConv64::createArgVariables ()
  * jancy: automaton samples (plus minor bugfixes)
  * axl: err::getError --> err::getLastError
  * axl: rtl::AutoPtrArray update
  * jancy: on linux gc-stratgy requires stack module before JITting
  * jancy: eof handling in recognizers
  * jancy: major update: automaton functions
  * axl: fsm library (finite state machines)
  * minor updates in protocol analyzer wizard
  * log.attachConverter accepts extra representerFunc argument
  * jancy: allow implicit casts void* to char* and to uchar_t*
  * minor updates in scripts and wizards
  * jancy: memchr, strchr is changed to return char*
  * Cast_Array should have OpFlag_LoadArrayRef (for now, to be removed later)
  * jancy: const-cast for arrays
  * allow implicit casts between integer types of the same size
  * udp socket compass button
  * jancy: minor updates in stdFunction.jnc and stdTypes.jnc
  * jancy: update in jnc2cpp.pl: support for namespaces so io ninja IDE can
    properly add standard items
  * plugin default settings should also be used when creating session
    by plugin file path
  * udp session: auto-switch remote address setting
  * paths.conf update: user-plugin-dir
  * debug trace support
  * fixes regarding failed add-layer
  * udp session: uses std log record codes TX & RX
  * updates re latest jancy changes
  * layer IDE wizards (answering machine and protocol analyzer) are finally
    functional
  * jancy: remove current thread module dependencies
  * operator new takes extra type* parameter
  * extra std functions for memory ops
  * bugfixes in pointer diff operator
  * jancy: mark heap allocations in new operator as temp stack roots
  * bugfixes regarding plugin open process
  * msi fixes in Add/Remove Programs entries
  * bugfix in PacketPad.jnc creation
  * minor gcc vararg fix
  * all plugins use import facilities to reduce compilation time
  * log representer is now a function rather than class (to enforce its
    stateless nature)
  * jancy: optional types and functions in API declarations
  * minor modifications in imports implementation
  * jancy: import declaration
  * setData checks for minDataSize
  * bugfix in CMakeLists.txt tests
  * improved logic for backspace from hex0 + cursor4bit
  * major redesign of packet templates
  * HexEditWidget bugfix in replaceSelection
  * HexEditWidget bugfixes in setDataSizeLimits
  * bugfixes and improvements in HexEditWidget
  * website -- introduction update
  * jancy: website markdown files
  * website markdown files
  * mascot update
  * minor update on wizard files
  * sessions and layers dirs are merged together (pugins dir)
  * wizards dir added (3 wizards: session, protocol analyzer layer, answering
    machine layer)
  * wizards.conf added
  * geeky ninja icon
  * package cleanup before the release
  * jancy: linux fixes
  * JNC_GC_ROOT_ENUMERATOR -> JNC_OPAQUE_CLASS
  * intptr->int warnings suppressed
  * jancy: dialog sample (properties, events, reactive programming)
  * jancy: gc bugfixes
  * preConstructor -> preconstructor
  * opaque class setup must specify actual size
  * export sample

................................................................................

version 3.2.5 (2014-12-31)

  * linux requires special handling of Ctrl+<letter>
  * jancy: linux bugfix re multicast destructors
  * TerminalWidget should kill selection on screen buffer change
  * bugfix in TerminalScreenBuffer::getLine ()
  * new defaults for ssh channel
  * pty: xterm
  * address: sdf.org:22
  * user: new
  * bugfix in TerminalWidget (TerminalLine* could be referred from
    both m_history and m_console)
  * bugfix: paint always painted all the way down till the end of
    console
  * copy/paste support in terminal
  * axl: ecc-key: set utf8 for console output
  * xterm mouse support
  * application cursor key mode support in TerminalWidget
  * xterm support
  * jancy: bugfix: jnc.FmtLiteral must be a root (even though it has no fat
    pointers)
  * support for connect cancellation in SSH channel
  * intercept ctrl+<letter> keys in terminal widget (optional)
  * exceptions in plugin constructor were not handled properly (main
    app remained waiting)
  * jancy: 'const' post-declarator modifier is made part of declarator_suffix
    (so 'throws' and 'const' can be specified in any order
  * changelog: show all comits after the latest release also
  * jancy: construction sequence change: field constructors -> field
    initializers -> property constructors -> preconstructor -> constructor
    (before field initializers were called as part of a preconstructor)
  * update ioninja api to re-used IfaceHdr of basetype (applies to
    Property->IntProperty and Plugin->Session/Layer)
  * jancy: major structural refactoring:
  * common code from DerivableType and Property moved to NamedTypeBlock
  * static and member destructors are called in reverse order of
    corresponding constructors
  * property constructors and field initializers implementation
  * class re-uses IfaceHdr from the first parent
  * jancy: VTable -> vtable
  * property getDefaultConstructor () removed -- properties don't have
    overloaded constructors anyway
  * jancy: property constructors, destructors, field initializers -- work in
    simple cases (still need to refine)
  * opaque class GC root enumerator placeholders
  * axl: CPCap -> PCap
  * jancy: allocate memory for formatting literals from GC heap
  * jancy: gc-mark opaque classes, multicasts and multicast snapshots
  * axl: bugfix: hexcode buffer must be at least 9 chars long
  * axl: bugfix in escape encoding -- must force null-termination of a hex
    code
  * axl: escape encoding now supports unicode characters \u \U
  * if pattern is incremental then start from the last found location
  * axl: bugfix: incremental boyer-moore find should use offset in case of
    empty pattern
  * axl: boyer-moore find should actually succeed on empty pattern
  * JNC_API_XXX --> JNC_XXX
  * jancy: JNC_API_XXX --> JNC_XXX
  * hexedit should paste text as hex if the cursor is in hex area
  * bugfix: copy from bintext line
  * jancy: prevent adding fields and virtual methods to extension namespaces
    (before it was possible to cheat by using in-property firleds or virtuals)
  * jancy: reactor recursion protection
  * refinement of comments in samples
  * jancy: sample pack comment updates by dima
  * jancy: minor sample updates
  * jancy: bugfix: remove TokenKind_Signed
  * jancy: gcc callconv fixes
  * jancy: major sample pack update
  * jancy: major redesign of extension namespaces
  * using declaration implemented
  * jancy: bugfix: arg_pass1 did not add parentheses into token list
  * jancy: bugfix: bitflag enum did not accept '0' (cause of recent integer
    const type change unsigned vs signed)
  * jancy: support for escape sequences in single-quoted literals
  * jancy: more bugfixes regarding try/catch/finally
  * jancy: bugfixes regarding try/catch/finally
  * jancy: jnc.setPosixError, jnc.setStringError std functions
  * jancy: bugfix: getInt32TypeKind_u/getInt64TypeKind_u should actually
    return signed types (otherwise all the integer constants are unsigned)
  * jancy: support for 'bindingof' without parentheses in 'onevent' statment
  * 'extend' -> 'extension' (for symmetry: extend is a verb, namespace is a
    noun)
  * jancy: allow casts from non-POD* to POD const*
  * jancy: update of the last commit
  * jancy: bugfix: tls object header was not constructed properly
  * variable scope level is NOT variabl->getScope ()->getLevel () (for example,
    local statics, or local tls variables)
  * jancy: assert statements implemented
  * changelog: linux fixes
  * changelog: created perl utility to generate changelog out of git commits
  * scripts updated to use dynamic sizeof instead of
    jnc.getDataPtrSpan
  * jancy: jnc.getDataPtrSpan is removed (not needed now when we have dynamic
    sizeof)
  * scripts brought to conformance with the latest jancy changes
    (i.e. dynamic casts and static new)
  * jancy: bugfix: getHeapVariableObjHdr caused a crash (cause of null type)
  * removed static new/stack new operators from jancy samples
  * jancy: prevent dynamic casts const->non-const
  * prevent casts non-pod -> void*
  * support for dynamic casts of arrays
  * jancy: variable object headers
  * dynamic casts
  * dynamic sizeof
  * dynamic countof
  * jancy: scripts brought to conformance with latest jancy grammar
    changes
  * jancy: grammar bugfix (now that we have dynamic sizeof/countof/typeof,
    type_name_or_expr must return Value, not Type*)
  * jancy: unmanaged heap -> gone
  * jancy: pragma pack -> gone
  * jancy: pack -> alignment
  * jancy: fenum -> bitflag enum
  * jancy: cenum -> exposed enum
  * jancy: dconst -> readonly
  * jancy: devent -> gone
  * jancy: dtypeof -> dynamic typeof
  * dynamic sizeof
  * dynamic countof
  * dynamic cast

................................................................................

version 3.2.3 (2014-11-17)

  * handle LIBSSH2_ERROR_EGAIN in SshChannel::write ()
  * jancy: ragel highlighters included headers from src dir (which required
    adding src dir to includes)
  * cursor selection in ASCII area did not work properly
  * axl: MappedFile bugfix: under POSIX mapping view beyond end-of-file
    caused bus error

................................................................................

version 3.2.2 (2014-11-14)

  * post-fold caret, selection and hilite validation and update
  * sessions use ansi-escape sequences for hyper text
  * bugfix: don't update CachePage::m_indexLeaf.m_lineCount int
    CachePage::insertRemoveLines (already done in
    CacheMgr::onFoldRecordCompleted)
  * validate and update caret pos after fold completed
  * axl: HyperText -- actually, it should ignore \n: line-handling should
    be done before feeding data to HyperText
  * axl: bugfixes and updates
  * axl: AnsiAttrParser and HyperText bugfixes and updates
  * bugfix: length used before initialization
  * log widget validate cursor pos takes selAnchor into account
  * hex-edit widget validate cursor pos takes selAnchor into account
  * axl:fast widget scrolling support (instead of full redraw)
  * corner button bug fixes and adaptation for fast scrolling
  * axl:ansi attributes
  * hyper text uses ansi attributes instead of <> tags
  * forced limit in JncRepresenterTarget::addPart () -- Sniffer
    plugin occasionally crashed on bad packets
  * workaround: corner button was drawn on black background on linux
  * axl: bugfix: std palette did not mask out alpha channel
  * bugfix: widget should stop caret timer on destruction
  * axl: QT monospace font force integer metrics
  * QT std palette
  * axl: TextPaint update
  * LogWidget/HexEditWidget/Terminal widget update to use new TextPaint
  * cmake: include_directories should not be part of master CMakeLists.txt
    files
  * activationFinished signal should use int status (moc doesn't do
    well with nested typedefs)

................................................................................

version 3.2.1 (2014-11-10)

  * axl: default font flags should be 0, not -1
  * axl: major gui subsystem redesign
  * axl: ecc-key -- linux update
  * nj_keygen is removed (no need anymore)
  * axl: ecc-key utility for generating license keys & product keys
  * LicenseMgr update -- rely on axl::cry::EcKey
  * support for 2 license kinds and 3 keys (personal, workgroup licenses +
    activation key)
  * axl: ecc product keys implemented
  * axl: open-ssl wrappers (axl::cry)
  * all codecs moved to axl::enc namespace
  * base32 encoding implemented

................................................................................

version 3.2.0 (2014-11-03)

  introduces: Linux packages, Java naming convention, log search functionality,
  auto-update, option to sudo plugins under Linux

  * update-database change (split by os-cpu)
  * shell script updates (rpmbuild and debpkg should be sudone)
  * axl: gcc fixups in BoyerMooreFind
  * signed-unsigned comparison warning fix
  * reverse find implemented
  * LogWidget::processCache -- support for reverse line order (if startLine >
    lastLine)
  * bugfix: mouse wheel delta can actually be less than 120
  * so need to accumulate deltas
  * find improvements
  * switch to new boyer-moore find
  * text-find and binary-find
  * case-sensitive and whole-word-only features are functional
  * (find-prev not yet)
  * hex-edit data-changed notification
  * find uses new boyer-moore instead of boyer-moore horspool
  * jancy: tests->test
  * axl: boyer-moore bugfixes
  * tests->test
  * axl: boyer-moore enhancements:
  * whole-word support
  * pass offset in incremental-find
  * find and reverse-find return same offsets
  * axl: full boyer-moore (good-skip/bad-skip)
  * axl: horspool variation (bad-skip only)
  * axl: utf support in boyer-moore find
  * axl: case-insensitive find (unicode-aware, but no special cases)
  * axl: reverse boyer-moore find
  * axl: incremental boyer-moorefind
  * cmake: configure_file_w_permissions doesn't try to detect whether the full
    dst path was specified or not (use CMAKE_CURRENT_BINARY_DIR for output)
  * package scripts bugfixes
  * auto-update file format redesign (to support multiple
    installation types: msi, zip, deb, rpm, tar)
  * bugfix in AniLabelWidget
  * AniLabelWidget optimization attempt. CPU load showed 5% on Release build
    when About dialog was shown. ridiculous! i supposed switching from QTimer
    to QBasicTimer, caching rich text and  drawing only the visible part of it
    would speed up animation. turns out, no. the solution happened to be
    drawing background by hand, cpu load dropped to reasonable values after
    that
  * typo in transportFlags
  * hide run-as-root without layout distortion (change QHBoxLayout->QWidget
    container)
  * run as root via sudo
  * delete session temporary files
  * also, fixups regarding closing of the transport when terminating on
  * errors
  * axl: attach/detach file handles (io.File, io.MappedFile,
    io.SharedMemoryTransport)
  * axl: FileFlag_DeleteOnClose calls unlink () on linux
  * desktop file for deb & rpm packages
  * remove tmp files generated as a result of erroneous linux conf
    files
  * jancy: don't create imports when parsing std function declarations
  * linux fixes
  * linux packages
  * package update (use specialized paths-*.cmake, without unnecessary
    libs/tools)
  * zip package
  * msi package update (do not expand paths.conf on installation
  * keep conf files in ./conf dir)
  * detect conf dir
  * expand std paths in paths.conf
  * axl: getExeFilePath (), getExeFileDir ()
  * zip packages for publishing
  * jancy: std function declarations are moved to jnc file just like std types
  * internal types are hidden from public jnc namespace
  * support for
    jnc.String/jnc.StringRef/jnc.ConstBuffer/jnc.ConstBufferRef/jnc.BufferRef
    in formatting literals
  * StdLib.getErrorDescription is moved to dedcated type jnc.Error (this way
    property m_description is not mapped unless type jnc.Error is really used)
  * jancy: return error if formatting literal doesn't know how to format a
    value
  * jancy: automatically cast from Derivable& to Derivable*
  * jancy: operator cdecl ... () is added to String and StringRef
  * jancy: operator ... / operator cdecl ... (to specify how to pass types in
    vararg functions)
  * jancy: typo in jnc_String.jnc
  * jancy: struct constructor cast should be prevented not via type map, but
    rather via simple bool flag -- multistep conversions should be disallowed
    anyway
  * jancy: String/StringRef/StringBuilder
  * jancy: ConstBuffer/ConstBufferRef/BufferRef/Buffer std types draft
  * jancy: support for skipping the first function overload
  * jancy: prevent infinite recursion when trying struct constructor casts
  * jancy: bugfix: formatting literal was losing the ending portion
  * jancy: formatting literal improvements (support for indexed-based argument
    injection)
  * jancy: function_suffix_rslv to allow C++-style constructors
  * jancy: setas declaration -- for specifying setter argument types
  * jancy: getArgCastKind for Value arrays
  * if CastOp::cast (): if constCast fails, fall back to llvmCast (essential
    for constructor-casts)
  * CastOp_Struct uses constructor-casts as a last-resort cast
  * jancy: std typedefs (size_t, uint_t etc)
  * jnc.String/StringRef draft
  * update re latest jancy changes
  * jancy: api overload mapping redesing
  * api macros for mapping struct and union members
  * jancy: overloaded function support via JNC_API_XXX macros
  * enum ApiSlotId -> enum ApiSlot
  * axl: replace ListLink with Entry in ListData -- this way it's easier
    to debug (can walk and inspect the whole list in locals/watch)
  * jancy: std type definitions are moved to perl-processed jancy source files
    (instead of manually assembling struct types by hand)
  * sh: test projects shell script, testing is made part of full rebuild
  * jancy: decided to remove throw conditions (it's never really needed
  * but it requires not-so-elegant syntax, a dedicated keyword and tricky error
    propagation logic)
  * sh: small updates in shell script output
  * cmake: disable linker warning 4221 (no public symbols in a source file)
  * update for the last fix: turns out, the style is not automatically deleted
    but it is altered upon during (and maybe after) setStyle (). therefore, we
    have to use the new instance every time and also make sure it doesn't
    linger indefinitely
  * bugfix: plugin list widget style should be dynamically created
    rather than static
  * ensure all stylesheets use namespaces
  * don't pass full source file list in command line, instead pass a
    single plugin file
  * switching read-only mode set 2px-wide caret (must be 1px)
  * axl: CMakeLists.txt update
  * axl: remove length limit in dbg::trace
  * axl: make gcc happy about names from base template type
  * axl: rename crc16 (used in Packetizer) to "checksum16" (cause it was not
    crc16)
  * remove redundant ...Kind suffixes from enum names (after java-style
    conversion)
  * keygen: signed/unsigned comparison warning
  * axl: Iterator redesign: instead of storing ListLink pointer, it's
    better to store Entry pointer -- this way it's easier to see contents of
    iterator in the debugger
  * linux fixes
  * qtWidget -> QtWidget
  * keygen: fixed size_t -> int warnings on amd64 builds
  * java naming convention
  * jancy: java naming convention
  * bulldozer: java naming convention
  * axl: type names brought to java naming convention
  * axl: variables, fields, functions brought to java naming convention
  * keygen: during linux port attempt it stopped compiling under windows
    restore for now, refactor/port later
  * windows shell scripts update -- detect CPU by default
  * don't build keygen on linux yet
  * keygen doesn't compile on linux and needs minor porting. but it has to
    be refactored anyway, so postpone that for now
  * linux shell script updates
  * calculate build times
  * halt build process on any error
  * use native processor architecture by default
  * accept processor aliases (x86/i386, amd64/x86_64/x64)
  * bugfix: shell script rebuild-all calculated elapsed time
    incorrectly
  * wix installer fix (incorrect redist dir)
  * shell script updates: add calc-time-diff script to calculate
    build times
  * switch to lowercase (most examples on the web use lowercase)
  * wix installer updates
  * shell scripts no longer copies stuff into files/ dir before invoking
    heat/candle/light (instead, it uses original files directly)
  * INSTALLDIR layout has been redesigned a little bit: executables,
    redistributables and conf files go into INSTALLDIR/bin
  * uninstall shortcut is created
  * remove 'scripts' folder from the project (no more CMakeLists.txt
    in 'scripts') originally it was useful to edit plugin and api .jnc files
    from Visual Studio. now it's much more convenient to do with IO Ninja IDE

................................................................................

version 3.1.2 (2014-09-23)

  * trim user name and product key
  * disabling activation bugfixes
  * activation disabled
  * sample packet-templates.jnc is put into scripts/samples
  * nj_keygen app
  * sh: build for windows no longer requires WIX in the PATH
  * installer build scripts re-engineered
  * installers for linux: deb, rpm, tar
  * bulldozer: bugfix: CppParserUtils.lua should be prepended with '/'
  * axl: bugfix: incorrect posix flags in CFile::Open
  * cmake: Paths.cmake.template had QT_DLL_DIR missing
  * bulldozer: frame for c++ parser is split into 2 files (CppParser.cpp.in
    and CppParser.h.in)
  * lua support code is put into CppParserUtils.lua
  * bulldozer.cmake is updated to support generation of both *.llk.cpp and
    *.llk.h files in one go
  * sh: update: clean everything first, then build
  * cmake: bugfixes: added @ONLY for generated cmake modules
  * sh: update of linux set-variables shell script
  * jancy: update: on 64-bit there are no divdi3/moddi3
  * jancy: add mappings for divdi3/udivdi3/moddi3/umoddi3
  * cmake: bugfix: generated files in cmake/latest had TARGET_CPU already
    substituted, need to use @ONLY
  * debug trace in PaintLineRange
  * sitara transfer plugin
  * bugfix: serial session port-open did not use current values of
    Baud and FlowControl combos
  * crc16
  * typo in CMakeLists.txt
  * bugfix: filteransmitpage -- m_progressDlg was not nullified
    (caused a crash)
  * git: remove set-variables.template, remove set-variables from gitignore
  * git: remove cmake/latest/*.* from history
  * git: typo in gitignore
  * cmake: generated cmake files from the latest build are placed in
    cmake/latest
  * cmake:sh: cmake and build shell script updates for linux
  * cmake: sh: major refactoring of cmake and shell scripts
  * linux fixes
  * cmake: updates for linux
  * axl: libusb support

................................................................................

version 3.1.1 (2014-08-28)

  * fold record-related bugfixes: bindata config was not passed and
    follow-up foldrecord line indices were not re-indexed properly
  * log file save / load works now (before there were access issues)
  * remove io::EFileFlag_ReadOnly from record file open -- otherwise
    cannot fold
  * add line feed \n to record, index node and merge point
    signatures
  * axl: shared memory transport: add line feed \n to message signature
  * tmp-log-file command line switch -- adds
    io::EFileFlag_DeleteOnClose when opening log file
  * axl: shared memory transport uses io::EFileFlag_DeleteOnClose when
    creating transport file
  * axl: add FILE_SHARE_DELETE flag to file open flags -- important when
    using io::EFileFlag_DeleteOnClose
  * bugfix: not all the property grid calls were properly tunneled
  * jancy: always create alloca in entry block
  * otherwise it causes crash due to garbled address of __chkstk on windows 8
  * actually, it's an LLVM bug (incorrect sign-extension of address during
    lowering -- most likely they store address in 'int'), but the easy
    workaround turns out to be simply move allocas to entry block
  * bulldozer: version info, cmdline parsing via axl facilities
  * udp session: save last port in combo box history
  * git: remove set-variables.bat from history
  * jancy: bugfix: atoi was declared incorrectly
  * sh: to avoid confusion, renamed 'build' folders to 'sh' -- 'build' is
    commonly used as build location (='prj' in our case)
  * one week worth of refactoring

................................................................................

version 3.1.0 (2014-08-15)

  initial public release of IO Ninja 3 (accumulation of 3.0.x improvements)

  * showing error message when trying to install 32-Bit and 64-Bit versions at
    the same time
  * axl: bugfix: incorrect cast in return from -1
  * include tag suffix and cpu suffix in version string
  * axl: dword_t -> size_t (otherwise it's very error-prone on win64)
  * version info resources
  * visualizing state about linked or layered sessions through MDI
    tab icons
  * copying redistributables from the folder named after TARGET_CPU
    specified in set-variables.bat

................................................................................

version 3.0.21 (2014-08-13)

  * added null-ptr checks to keyboard handlers (crashed on empty
    log)
  * removed old stdin-stdout transport (use shared memory transport)
  * use stdin in ioninja-server to control life time (once stdin is
    disconnected, terminate ioninja-server process)
  * remove m_menuAction from Document (not really necessary)
  * each session has its own menu (before menu items from different
    sesssion accumulated in stdMenu (SessionMenu))
  * added icon for the executable on windows
  * document didn't remove widget from status bar on deactivation
  * cmake: copy_qt_dll_files incorrectly created Debug or Release file
    (instead of the directory) which, in turn, prevented subsequent builds
  * jancy: on MSVC it is illegal to create zero-length array, so CApiBaseT was
    adjusted
  * bugfix: scroll buttons in MDI's tab bar displayed transparent
  * changed it to white background with a solid border matching rest of the
    tabs
  * a couple of gcc warning-related fixes
  * bulldozer: a couple of gcc warning-related fixes
  * compiles and runs on linux-x86_64 -- finally
  * jancy: x86_64 System V ABI support
  * cmake: gcc setting for no-invalid-offsetof warning
  * jancy: gcc tail-padding issue workaround
  * axl: shared memory transport for POSIX
  * shrinking tabs in MDI's tab bar as much as possible before
    showing scroll buttons
  * 64-bit installer
  * 64-bit installer can be run by setting TARGET_CPU flag in set-variables.bat
    to 'amd64'
  * minor bugfixes in jancy files
  * tests for running ioninja-server on all official plugins
  * -x switch for passing plugin project file instead of full list of
    jancy source files
  * axl: CParserT::ParseFile
  * axl: CString 'operator +' for utf32_t (was missing)
  * axl: CMapping and CSimpleMappedFile updates
  * bugfix: struct LineAttr was incorrectly declared (layout
    inconsistency ninja scroll C++ vs jancy)
  * jancy: bugfix: incorrect struct aligned size calculation
  * jancy: remove SRet attribute from Microsoft x64 calling convention (LLVM
    JIT crashes if sret is present)
  * remove compile warnings
  * jancy: bugfixes re amd64
  * jancy: bugfix: calling convention was not properly assigned to user
    functions
  * jancy: thiscall support
  * default calling convention for methods is still cdecl (unless explicitly
    specified as 'thiscall')
  * axl: rtl::CAutoPtrArrayT
  * jancy: Microsoft x64 calling convention implemented. IO Ninja runs under
    amd64
  * copy QT dlls
  * cmake: copy QT dlls for ioninja and JncQtTest
  * bugfixes: uint_t -> size_t (important on amd64)
  * cmake: macro for copying QT dlls -- important when 2 builds of QT (both
    x86 & amd64) present on a computer
  * axl: bugfix: register format should be uintptr_t, not uint_t
  * jancy: bugfix: formatting literal for char array reference

................................................................................

version 3.0.19 (2014-07-28)

  * replace app-srv communications via stdin/stdout with shared
    memory transport, results in dramatic performance improvement under
    windows
  * axl: shared memory transport
  * simple mapped file
  * cross-platform mapping object
  * forgot to uncomment subsystem linker pragma
  * save log as text progress dialog, start session by specifying
    either session name, or session plugin path
  * jancy: when adding methods to a class, no need to overwrite tags (Parser
    should do it)
  * wrong QT file filter (extensions should be space-separated)
  * StatusBar.m_pane should be a const property
  * jancy: function tagging critucal temp-fix (operator-new -> operator_new)
  * show line/col/offset status panes for log documents
  * different cache page size defaults
  * cache process cancellation
  * find progress, find completion notifications
  * find dialog progress bar & cancellation support

................................................................................

version 3.0.18 (2014-07-18)

  * bugfix: installer did not find correct files for updating WinPcap
    and Serial Monitor

................................................................................

version 3.0.17 (2014-07-17)

  * re-engineer action UI in all sessions: replace pairs of action
    (like Open/Close, Connect/Disconnect etc) with single action with toggled
    semantic
  * added 2 properties to gui.Action: m_text & m_icon

................................................................................

version 3.0.16 (2014-07-16)

  * mark inactive MDI tabs which have unseen log records
  * status panes for the rest of plugins (file, pipe listener, serial
    monitor, network sniffer, tcp listener, tcp proxy udp socket)
  * status panes for Serial plugin
  * jancy: reactor starter should also bind to bind-sites in skipped branches
    of operators &&, ||, ?
  * currently, && and || are replaced with full-circuit evaluation via bitwise
    & and |
  * obviously, this is not a 100% clean solution
  * in the future on potentially skipped bind-sites should be flagged (if
    skipped in starter, then delay-bind)
  * jancy: bugfix: reactors potentially stored invalid event pointer in
    bindsite
  * status panes for SSH Channel plugin
  * status panes for Listener Socket plugin
  * status bar API
  * status panes for Connection Socket plugin
  * jancy: bugfix: static fields/variables with initializers were checked
    incorrectly
  * jancy: static field initialization
  * find dialog Cancel button connection
  * make a compilation-time define for choosing whether or not to
    show cache miss using different background color
  * NetworkSniffer Session: apply capture filter when pcap is open
  * improvemnts in copy from log (use the application/njs-bin) format
    in addition to text
  * edit commands support for HexEditWidget
  * Copy Bin as Jancy: Hex-literal command
  * improvements in paste operation in hex editor
  * copy/paste in hex editor
  * registry formats support (hex editor should copy both textual
    representation, which depends on cursor pos AND the actual binary data)
  * save log as text fixes:
  * \r\n on windows
  * keep IsTimestampVisible setting
  * keep IsIconVisible setting
  * keep IsOffsetVisible setting
  * different background for hexedit hex and ascii panes
  * read only mode for hex edit
  * new logo hexedit -- always have 1 line
  * even when there is no data
  * linux fixes
  * build scripts: mkdir --> mkdir -p
  * sniffer session: incorrect replace (new io.PCapDeviceDescList -->
  * io.createPCapDeviceDescList)
  * io_Socket updates re disconnect event
  * io_SocketAddress compatibility fixes

................................................................................

version 3.0.15 (2014-07-02)

  * sign binaries (including installer MSI)
  * jancy: change default throw conditions: retval < 0 for signed integers
  * retval == -1 for unsigned integers
  * update scripts as they don't need explicit cast literal->char
    const* in conditional expressions
  * jancy: array ref -> data ptr conversion is not performed by default
    anymore, instead, now it's an optional flag to PrepareOperand and
    PrepareOperandType. adjust GetConditionalOperatorResult: works for literals
    and keeps references if true and false types match

................................................................................

version 3.0.14 (2014-07-02)

  * TCP close kind property, TCP disconnect kind flags in
    SocketEvents, added 'from' information to Connect log record, added
    'close-kind' and 'initiator' information to Disconnect log record

................................................................................

version 3.0.13 (2014-07-01)

  * msi installer now includes qico.dll -- turns out QT needs a plugin for
    .ico support
  * remove record size limit to decide whether to buffer or not (it
    causes empty "stripes"). instead, always buffer during incremental update
    (non-rebuild). also, enforce check for missing parts in cache mgr (instead
    of assert)
  * don't report disconnect if GetIncomingDataSize () is zero --
    there is a race with the main thread, so 0 is actually normal
  * jancy: bitwise & operator yields fenum if one of the operands is fenum

................................................................................

version 3.0.11 (2014-06-23)

  * jancy: replace no_specifier -> wo_specifier in *.llk files
  * bulldozer: generation of "clean" EBNF presentation of input grammar
  * all the plugins now create opaque classes with 'new operator'
    (instead of 'createXxx' functions)
  * jancy: operator new for opaque classes
  * small bugfixes after linux port
  * api.conf and plugins.conf are made platform-dependent
  * sh: update set-variables.template for linux
  * git: remove set-variables from git history
  * git: update gitignore to include build/linux/set-variables
  * bugfixes: sockets, SSH
  * posix socket used incorrect error code for asynchronous connect
  * SSH channel was reporting incorrect event after TCP connect completed
  * include --debug flag for ioninja-server process on linux if NDEBUG flag
    is not set
  * sh: build scripts for linux
  * axl: remove ui_mainwindow.h
  * bugfixes: linux version is now functional
  * axl:gcc-compliance: project compiles on linux
  * jancy: bugfix: tmp gc roots were unconditionally nullified
  * nullify gc-root happened post-statement regardless of whether the block
  * is reachable or not. this caused an abort in MCJIT cause code was
  * injected past basic-block terminator (return statement). the solution is
  * to only nullify tmp gc rool list if the block is reachable
  * bugfix: installer did not overwrite all files when used in repair
    mode
  * bugfix: installer did not configure paths.conf due to missing
    rights
  * using a deferred custom action for gaining elevated rights. Must also use a
    further custom action for setting custom data for the deferred custom
    action
  * bugfix: corner button displayed too small

................................................................................

version 3.0.11 (2014-06-12)

  * new icon resources
  * bugfix: bin text map was calculated incorrectly if the data
    block ended in-between multi-unit code point..
  * bugfix: bin text map for the lines terminated with '\n'
  * typo in SnifferLog_Ip.jnc
  * document activate/deactivate improvements: use
    mdiArea->activeSubWindow instead of event argument
  * save current transmit page
  * removed merged record count tracking from index mgr (not
    releavant)
  * bugfixes: hiding messages did not properly work before. remove
    binary record count, merged record count and foldable record count from
    index leaf (not really relevant)
  * instead add hidden record count (important for caching). binary and
    foldable record count must still be tracked in index mgr (to determine
    whether changing bin-data-config should finalize the current leaf or not)
  * bugfix: serial log filter used incorrect flag variable for status
    line change check
  * bugfix: CIndexMgr incorrectly determined whether the first part
    was merged or not (relied on PartIdx, which gets reset every time parts are
    not merged). replace it with IsFirstPart flag
  * packet template editor dialog -- remove icon from the caption
  * bugfix: io::CSerial should force-set settings after open
    (otherwise baudRate, flowControl and other properties get out-of-sync, and,
    more importantly, read interval might be invalid (serial.read might wait
    for the whole buffer to fill)
  * bugfixes: SSH & TCP connection should close socket when remote
    side closes connection (otherwise there is a possible syncId mix up with
    SocketAddressResolver)
  * replace ProgressDlg and QFileDlg members with pointers -- this
    way plugin startup dialog for the documents shows up faster and response
    better (most likely, QFileDlg constructors initiates some jobs in
    background?)
  * bulldozer: lookahead statement syntax change

................................................................................

version 3.0.10 (2014-06-09)

  * file transmit is functional
  * resources update by leo: plugin icons, file icons, installer splash &
    banner

................................................................................

version 3.0.9 (2014-06-03)

  * bugfix: unexpected mdi tab switch after transmit pane tab switch
    (findNextPrevChild issue)
  * bring back file transmit page
  * proxy session icon
  * improvements of focus handling (set focus to contents of tab
    widget on current tab change)
  * small icons for drop down menus / tabs
  * big icons update from leo
  * small icons
  * new icons
  * log widget, terminal widget & hex edit widget now provide events for
    handling cursor pos change
  * ioninja main window displays line, col, offset, range in status bar
  * bugfix: incremental find should be reset when lines are not
    merged
  * basic find functionality is implemented (no
    case-insensitive/whole-words yet)
  * MRU list implemented
  * save-log-as-text is functional
  * log widget keyboard handling fixes
  * new layer dialog brought to consistency (vs new session dialog style)
  * log copy/save-bin-to-file is functional
  * corrected edit button title in binary transmit settings
  * cache processing prototypes (find, copy, copy-bin-as,
    save-bin-as-file, save-log-as-text)
  * plugin groups
  * remove CCopyMgr, CFindMgr -- they will be part of CLogWidget
  * add dropdown for New Layer toolbar command
  * bugfix: MDI area's tab bar and sub window was drawn too far to the
    right
  * implemented group functionality for New Session dialog's list
    view (including test groups)
  * displaying corner button in packet template property grid over
    header
  * bugfix: shortcut for 'New Session' action didn't work
  * modified MDI tab close icons
  * bugfix: MDI area's tab bar was drawn to far to the right
  * made selected MDI tab and MDI pane look connected by removing tab
    border
  * revert back TX & RX codes (not really important -- just so it
    matches with previously saved logs)
  * major update of logging engine
  * fold flags are now stored in record file rather than index file -- this
    allows for persistency of fold state across log file rebuilds/reopens
  * record code no longer needs to have mergeable flags: parts are what's
    merged, not records
  * instead of log filter which generates secondary log we now have 2 options:
    1) simple filter just hides unwanted messages (using fold flag field) and
    does NOT generate secondary log and 2) converter, which does generate
    secondary log. when only simple filter is attached, fold state persist
    across log file rebuilds
  * bugfix: 'New Session' action in menu also contained drop down list
  * separated 'New Session' action in two actions one containing drop down list
    used in toolbar and one without used in standard menu
  * drop down list in New Session action with list of all session
    providers
  * using rectangular MDI tabs with custom close icon
  * jancy: bugfix: COperatorMgr::GetArgCastKind didn't take default arguments
    into account
  * added corner button to packet template property grid
  * displaying Packet Template Editor when clicked
  * qtpropertybrowser: Added method for access to tree widget
  * bugfix: Packet Template Editor wasn't centered relative to the
    settings dialog
  * displaying message in About dialog when update check failed
  * corrected name in About dialog's team info label

................................................................................

version 3.0.8 (2014-05-22)

  * bugfix: corner button not positioned correctly in terminal widget
  * this was due to sizeHint() being called after updatePos() resulting in an
    incorrect corner button size
  * UI/API prototype for copy/find
  * save/load log is functional
  * ClearCache -> Rebuild (cause it's not just clear cache but also
    clear index)
  * clear part buffer after UpdateIndex (cause subsequent SetBinDataConfig
    might re-send what's left in the buffer)
  * set representer guid on log server create
  * axl: TGuid::Parse
  * added readme and license files to installer resources
  * bugfix: installer couldn't be built because of old reference to
    session-providers.conf instead of plugins.conf
  * save -> save session, save session as, save log as
  * save log implemented
  * forgot to uncomment subsystem/entry pragma in main.cpp
  * refactoring of license management UI
  * animated label widget with team info in AboutDlg
  * AniLabelWidget (for running line on team info)
  * implemented license registration and activation (server-side response
    handling not implemented yet)
  * listener is now a function* rather than class* -- this allows
    easy scheduling (we normally want to invoke listener in main thread)
  * listener sensitivity check (live-records-only vs all-records)
  * jancy: instead of marking as gc-collectible, add a tmp gc-root for every
    heap-new (marking as gc-collectible still does not invoke gcEnter/gcLeave
    if no roots are found). besides, gc-roots are still necessary for temporary
    closure objects
  * jancy: mark every function invoking gcAllocate as gc-collectible
  * jancy: scheduler had 'safe' modifier in function pointer argument --
    better take it out (not that necessary, and developers (me included) will
    constantly bump into 'override signature mismatch'
  * transmit history maintans 2 current blocks (text & binary)
  * changing tabs in setting dlg also changes to the corresponding tab in
    document/transmit widget
  * bugfix: fold record did not adjust cache page state line idx
  * bugfix: if fold record line count delta is non-null, invalidation should
    range all the way to the bottom
  * bugfix: foldable records calculated line count incorrectly (did
    not nullify m_pCurrentFoldableRecord)
  * sniffer interface list now includes IP address and excludes
    device name (which is real ugly)
  * generic file session: distinguish between file stream kinds (disk
    files, pipes, serial devices)
  * allow writing past EOF for disk files
  * add clear function for disk files
  * New Layer action is placed in File Menu and main-toolbar
  * document-specific actions are disabled if there is no active document
  * xmodem receive is functional
  * xmodem transmit is functional
  * gui.FileDlg, gui.ProgressDlg, io.MappedFile
  * Link Sessions functionality is now accessible via Setting Dialog
    rather than session tab context menu
  * filtering layers are functional (PPP sample)
  * *.njssp -> *.njplg
  * jancy: bugfix: POD*->void* should always be implicit
  * bugfix: pointer difference for void* caused division-by-zero
  * jancy: bugfix: static new class variables were primed twice, writing data
    out of allocated range
  * jancy: bugfix: pointer difference operator did not work
  * properties for plugins are grouped
  * already-added layer plugins are disabled
  * adding layers feature is functional!
  * ioninja-server compiles and jits additional layers
  * jancy: CModule - CRuntime pair redesign (move LlvmExecutionEngine to
    CModule to allow multiple modules to work with the single runtime) -- in
    preparation for incremental compilation & jitting (adding layers in
    ioninja-server)
  * minor design update in AboutDlg check-for-updates
  * setting dlg: rebuild log layout -> rebuild log widget (to
    simplify hiding it completely when m_document == NULL)
  * namespace prefix only for API files
  * plain names for folders (api, sessions, layers)
  * currently there is no reason to have namespace prefixes for the rest of
    plugin files, so as to avoid unnecessary questions i decided to simplify
    everything to a more conventional and less cryptic scheme
  * plugin manamenent cleanup
  * plugin management and api further updates
  * document model update (2 kinds of plugins: sessions and
    protocols)
  * log filtering is functional, serial session provider
    uses filters to show/hide groups of notification messages
  * jancy: bugfix: empty condition in for stmt caused a crash on JIT (compiler
    was creating an invalid basic block graph)
  * bugfix: API function 'io.createSerialPortList' accidentally removed
  * added Device Monitor feature to installer
  * added buttons for adding and removing filters in session settings dialog

................................................................................

version 3.0.7 (2014-04-26)

  * remove all the serial settings & lines (baud, flowcontrol, dtr,
    rts etc), from io.SerialMon -- instead of 'state' semantics, they should be
    represented by 'event' semantics. bugfix in io.SerialLogRepresenter: status
    line change parts were not merged properly
  * bugfix: incorrect line range update on tail-leaf-update
  * nj_srv should close .conf files when its done reading the
    configuration
  * serial mon plugin logs all the events (using SerialLogRecordCode
    / SerialLogRepresenter for most of the records)
  * jancy: re-fix the previous commits. todo: really clean this shit up
  * jancy: bugfix: the previous commit has broken certain scenarios (e.g when
    unnamed union is half way to the field, union-coord was added twice)
  * jancy: bugfix: resolve import types did not work properly if class had
    import base
  * bugfix: nested unnamed structs & unions did not work correctly in some
    cases (and i suspect still not 100% correct -- double check!)
  * jancy: creating member closures moved from CParser -> COperatorMgr
  * when using qualified name for virtual functions don't lookup vtable (get
    LlvmValue of the parent class)
  * making use of 'io.createSerialPortList' and
    'Document.createSerialPortProperty' in Serial session provider
  * added io.createSerialPortList and Document.createSerialPortProperty to API
  * jancy: allow using basetype in functions other than constructors: as type
    specifiers and as namespaces
  * background change of combo boxes if local port or target address
    changed while listening in TCP Proxy session provider
  * jancy: don't erase unreachable blocks if they were added to function
    (potentially causes assert failures in LLVM: value is used. most likely
    this assert is not relevant: block is used from unreachable block, but
    still)
  * serial mon plugin base functionality (using tdevmon service)
  * axl: legacy packetizer (compatible with previous versions of AXL, and
    tdevmon in particular)
  * background change of local port combo box in UDP session provider
    if port changed during open state
  * added 'gui.ComboBox.m_backgroundColor ' property to API
  * using address resolver for target address in TCP Proxy session
    provider
  * using address resolver for remote address in UDP session
    provider
  * refactored UDP session provider to share same code style as the
    other session providers
  * out of class definitions
  * use of State enum
  * use of ActionId enum
  * cleaned up Serial session provider
  * bugfix: io.CSerial had incorrect order of autoget fields
  * bugfix: io.CSerial did not update autoget fields on serial
    setting change
  * jancy: bugfix: getLastError () did not copy the TError struct (previous
    commit actually had incorrect description: actually it implements host name
    resolver and proper error handling in SSH channel session)
  * jancy: bugfix: getLastError () did not copy the TError struct
  * axl: remove CString::c () (cast to char*)
  * CString::cc () never returns NULL
  * socket address resolver implemented
  * TCP Connection session uses this resolver, allowing specifying address by
    name
  * displaying 'Run IO Ninja 3' checkbox in installer only if color
    depth of screen is 32 bit. this is to avoid that the checkbox otherwise
    overlays the background (alpha bitmap) with its own control background
  * io.Socket properties: m_closeKind, m_isNagleEnabled
  * use these properties in TcpConnection session provider
  * added default packet template file to installer
  * creating default packet templates files if none exists
  * reading and writing packet template file in user's documents
    directory
  * only reloading packet template and clearing hex editor when
    template was modified
  * bugfix: current data in binary transmit widget not always kept when
    swichting sessions
  * bugfix in CHexEditWidget::CalcCursorPos () -- incorrect column
    calculation
  * bugfix: hex editor data wasn't applied to array properties in packet
    template widget

................................................................................

version 3.0.6 (2014-04-21)

  * loading hex editor data into packet template property widget when
    transmitting
  * bugfix: unlink sessions menu item was not connected properly
  * session linking is implemented
  * serverProcess_readyRead () slot: replace loop with a single readAll () --
    if ioninja-server produces data faster than log widget can update index
    and cache pages, the loop never exits, and requires extra event
    processing (to keep ninja responsive)
  * renamed packet template file (packet_templates.jnc -> packet-templates.jnc)
  * axl: critical bugfix: MappedFile on Windows sometimes failed View ()
    if aligned end-of-view fell behind mapped-size
  * loading proper default values in packet template property widget
  * displaying bit fields with a bit count of 1 as a bool property within
    packet template widget
  * highlighting selected packet template property in hex editor
  * qtpropertybrowser: changed first column's tooltip (property name) with
    property tooltip
  * bugfix: pressing Enter in packet template widget caused the transmit
    action to be triggered
  * bugfix: packet template file not created when trying to edit a new
    template file
  * link sessions menus
  * support for hexadecimal input for bit fields in packet template widget
  * removed signed/unsigned checks in packet template widget
  * warning about errors in packet template editor
  * include part-buffer in update-tail-leaf notification. this
    way log-widget can update its cache without the need of sending
    represnet-request to the log-server
  * indicating if packet templates are available or not in settings
    dialog
  * bugfix: current packet template wasn't selected in settings dialog
  * removed bit count from bit field properties in packet template
    widget
  * renamed "transmit template" to "packet template"
  * optimized mask creation for bit field modifications in packet
    template widget
  * hexedit: highlight on write capability
  * modified echos in installer build script

................................................................................

version 3.0.5 (2014-04-17)

  * LogSettingPage: disable 'apply-to-all-log' if log widget is NULL
  * prompt for unsaved changes before closing transmit template editor
  * remove main window search loop
  * sticky log (scroll to bottom when vscroll is maxed)
  * scroll-to-bottom corner button in log widget
  * added button for checking for updates in About dialog
  * jancy: restore original order of resolve-orphans and resolve-import types
  * templatetransmitmanager -> templatetransmitmgr
  * jancy: bugfix: DeleteUnreachableBlock caused a dangling pointer write in
    case last current block was unreachable block
  * CModule support for calc-layout without actual compilation
  * bugfix: update check not working correctly
  * cmake: PCH for MSVC is placed in $(Configuration) subfolder
  * jancy: bugfix: ensure 8 bytes for const buffer (GetLlvmConst
    unconditionally reads 8 bytes)

................................................................................

version 3.0.4 (2014-04-16)

  * catch exceptions in ioninja-server and report them to the application
  * prompt before closing unsaved changes in transmit template editor
  * removal of undesired delimiter above TransmitWidget tab implemented
    transmit templates
  * jancy: bugfix: bit-field offset calculation during CalcLayout
  * isTransmitEnabled property -- to disable 'Send' button when there
    is no connection
  * bugfix: delete all the page requests from the map when the page
    is dropped
  * fold record support in new log engine design
  * SSH channel session: log messages update (merge all the 'connecting'
    messages together, so there are no inter-line delimiters)
  * bugfixes in logging engine
  * index mgr: finalize leaf on mergable record
  * cache mgr: set index tail leaf bin data config
  * bin text line: bin text map calculation and code point decoder state
  * highlight unprintable chars setting
  * axl: bugfix in CCharCodec::LoadState/SaveState
  * bugfixes and updates (mostly re bin-text mode)
  * new log engine design updates
  * major redesign of logging engine and protocol (initial commit)
  * qtpropertybrowser: header column labels can be set via constructor
  * fixed "mismatched component reference" warning when building
    installer
  * sh: build-projects.bat saves and restores current dir (otherwise
    rebuild-all fails to build installer)
  * build and installer scripts cleanup
  * adjusted corner button fade time
  * added "Run IO Ninja" to exit dialog of installer
  * msi installer actions DLL project is generated by CMake and is
    built together with other ioninja binaries
  * formatted batch scripts
  * removed directory "icons" from installer
  * added folder 'redist' to gitignore
  * WIX installer updates
  * generate .rl.cpp & .llk.h in output folder to keep source folder clean
  * WIX installer's build.bat takes a parameter defining base directory for
    files, redistributables and output
  * cmake: version templates for ioninja app and installer
  * initial commit of encoding support in log-plain-text mode
  * WIX installer
  * version automation and build script adjustments still missing

................................................................................

version 3.0.2 (2014-04-07)

  * session startup dialog update (display errors)
  * remove UTF32->UTF8 conversion in terminal lines (draw UTF32 directly)
  * axl: support for UTF32 drawing in gui::CTextPaint
  * session startup dialog
  * log setting page update
  * all the dialogs tab order fixups
  * log setting page: include showСheckerPattern option + some layout
    modifications
  * checker pattern colorization (to show merged packet boundaries)

................................................................................

version 3.0.1 (2014-04-02)

  initial internal release of IO Ninja 3
