diff --git a/.jazzy.yaml b/.jazzy.yaml deleted file mode 100644 index c7f6323..0000000 --- a/.jazzy.yaml +++ /dev/null @@ -1,8 +0,0 @@ -module: PerfectSQLite -author: PerfectlySoft -author_url: https://perfect.org -github_url: https://github.com/PerfectlySoft/Perfect-SQLite -copyright: '© 2016 PerfectlySoft Inc. and the Perfect project authors' -theme: fullwidth -xcodebuild_arguments: [-target, SQLite, -toolchain, org.swift.3020160620a] -clean: true diff --git a/Package.swift b/Package.swift index f52f24e..fbc0557 100644 --- a/Package.swift +++ b/Package.swift @@ -8,7 +8,7 @@ let package = Package( .library(name: "PerfectSQLite", targets: ["PerfectSQLite"]), ], dependencies: [ - .package(url: "https://github.com/PerfectlySoft/Perfect-CRUD.git", branch: "main"), + .package(url: "https://github.com/PerfectlySoft/Perfect-CRUD.git", from: "3.0.1"), ], targets: [ // System SQLite for Linux, which has no SQLite3 module like Apple's SDK. diff --git a/README.md b/README.md index c32d5be..839b49c 100644 --- a/README.md +++ b/README.md @@ -14,9 +14,9 @@ This project provides a Swift wrapper around the SQLite 3 C library, plus a [Perfect-CRUD](https://github.com/PerfectlySoft/Perfect-CRUD) database driver built on top of it. -**Modernized for Swift 6.** Requires **swift-tools-version 6.2** and builds under full **Swift 6 language mode** (strict concurrency checking on for both the library and test targets). Supports **macOS 12+** and **iOS 15+** (`platforms: [.macOS(.v12), .iOS(.v15)]`) and **Linux** (tested with Swift 6.2.4, 6.3.2 and 6.4 on Ubuntu 24.04). CI runs the tests on Linux (Swift 6.2 and 6.4), macOS (Xcode 26.0.1 and 26.6) and the iOS Simulator. tvOS/watchOS/visionOS aren't declared or tested. +**Modernized for Swift 6.** Requires **swift-tools-version 6.2** and builds under full **Swift 6 language mode** (strict concurrency checking on for both the library and test targets). Supports **macOS 12+** and **iOS 15+** (`platforms: [.macOS(.v12), .iOS(.v15)]`) and **Linux** (tested with Swift 6.2.4, 6.3.2 and 6.4 on Ubuntu 24.04). It needs SQLite 3.29 or newer for every feature below (the macOS 12+/iOS 15+ SDKs and Ubuntu 24.04 have newer). CI runs the tests on Linux (Swift 6.2 and 6.4), macOS (Xcode 26.0.1 and 26.6) and the iOS Simulator. tvOS/watchOS/visionOS aren't declared or tested. -The pre-Swift-6 version of this package is preserved on the [`legacy`](../../tree/legacy) branch. +The pre-Swift-6 version of this package (5.0.0) is preserved on the [`legacy`](../../tree/legacy) branch. See [Migrating from 5.x](#migrating-from-5x) when upgrading. ## What's in this package @@ -25,7 +25,21 @@ The pre-Swift-6 version of this package is preserved on the [`legacy`](../../tre - **`SQLite.swift`** — a thin, synchronous Swift wrapper around the SQLite3 C API: the `SQLite` class (open/close/prepare/execute/`forEachRow`/transactions) and `SQLiteStmt` (bind-by-position/name, column reading). - **`SQLiteCRUD.swift`** — about two-thirds of the package's source — implements the integration that lets [Perfect-CRUD](https://github.com/PerfectlySoft/Perfect-CRUD)'s typed query builder target a SQLite database: `SQLiteCRUDRowReader` (a `KeyedDecodingContainer` bridge from SQLite columns to `Codable` types), `SQLiteGenDelegate`/`SQLiteExeDelegate` (PerfectCRUD's `SQLGenDelegate`/`SQLExeDelegate`), and `SQLiteDatabaseConfiguration: DatabaseConfigurationProtocol`. -Both `SQLite` and `SQLiteStmt` (and the CRUD delegate classes) are marked `@unchecked Sendable` rather than being actors — there is no async/await anywhere in this module. This is a manual Sendable opt-out around raw `OpaquePointer`/mutable C-backed state: none of these types are internally thread-safe, so callers are responsible for serializing their own access to a given `SQLite`/`SQLiteStmt` instance. +`SQLite`, `SQLiteStmt`, `SQLiteDatabaseConfiguration` and the CRUD delegate classes are marked `@unchecked Sendable` rather than being actors; this module has no async code of its own. None of them is internally thread-safe: use a connection from one task at a time. Moving a connection between threads is fine (SQLite is built multi-thread on Apple platforms and serialized on Ubuntu; a single-threaded build isn't supported), but using one connection, or one `Database` value, from two tasks at once is not. + +Because `SQLiteDatabaseConfiguration` is `Sendable`, Perfect-CRUD's async API works with it: `DatabaseConnectionPool`, `transactionAsync`, `sqlAsync`, `insertAsync`, `firstAsync` and `fetchAll()`. They run the blocking SQLite calls on Perfect-CRUD's dispatch queue while the caller waits. For concurrent work, give each task its own connection, for example from a pool: + +```swift +let pool = try DatabaseConnectionPool( + configuration: .init(minConnections: 1, maxConnections: 4)) { + try SQLiteDatabaseConfiguration("./db/database") +} +let posts = try await pool.withConnection { db in + try await db.table(Post.self).fetchAll() +} +``` + +Connections in a pool are separate SQLite connections to the same file, so writers still take SQLite's database lock one at a time (waiting up to the busy timeout). ## Dependencies @@ -33,7 +47,7 @@ This package has a single dependency: ```swift dependencies: [ - .package(url: "https://github.com/PerfectlySoft/Perfect-CRUD.git", branch: "main"), + .package(url: "https://github.com/PerfectlySoft/Perfect-CRUD.git", from: "3.0.1"), ], ``` @@ -51,29 +65,46 @@ Add this project as a dependency in your `Package.swift`: ```swift dependencies: [ - .package(url: "https://github.com/PerfectlySoft/Perfect-SQLite.git", branch: "main"), + .package(url: "https://github.com/PerfectlySoft/Perfect-SQLite.git", from: "6.0.0"), ], ``` and add `"PerfectSQLite"` to your target's `dependencies` array. You need the Swift 6.2 toolchain (or newer). - **macOS / iOS:** SQLite ships with the macOS 12+ and iOS 15+ SDKs; nothing else to install. If the build fails on `PerfectCSQLite` (`no such module 'PerfectCSQLite'` or `unable to resolve module dependency: 'PerfectCSQLite'`), the SDK's `SQLite3` module wasn't found: check the selected toolchain and SDK (`xcode-select -p`, `xcrun --show-sdk-path`). -- **Linux:** install the SQLite development package (`sqlite-devel` on Fedora/RHEL), e.g. on Debian/Ubuntu: +- **Linux:** install the SQLite development package (`sqlite-devel` on Fedora/RHEL) and `pkg-config`, which SwiftPM uses to find it (the official `swift` Docker images already have `pkg-config`), e.g. on Debian/Ubuntu: ```bash - apt-get install libsqlite3-dev + apt-get install libsqlite3-dev pkg-config ``` Without it the build fails with `'sqlite3.h' file not found`, and SwiftPM suggests the package to install. ## Double-quoted strings are identifiers -Every connection opened by `SQLite(...)` or `SQLiteDatabaseConfiguration(...)` turns off SQLite's [double-quoted string literal](https://www.sqlite.org/quirks.html#dblquote) fallback, which the macOS SDK and Ubuntu's `libsqlite3` both leave on. With the fallback on, a double-quoted name that matches no column silently becomes a string: `DELETE FROM t WHERE "nmae" = 'nmae'` deletes every row instead of failing. Perfect-CRUD's Dynamic API double-quotes caller-supplied field names, so a misspelled field name in a Dynamic delete or update hit every row (or silently none). +Every connection opened by `SQLite(...)` or `SQLiteDatabaseConfiguration(...)` turns off SQLite's [double-quoted string literal](https://www.sqlite.org/quirks.html#dblquote) fallback, which the macOS SDK and Ubuntu's `libsqlite3` both leave on. With the fallback on, a double-quoted name that matches no column silently becomes a string: `DELETE FROM t WHERE "nmae" = 'nmae'` deletes every row instead of failing. Perfect-CRUD's Dynamic API double-quotes caller-supplied field names, so with the fallback on, a misspelled field name in a Dynamic delete or update would hit every row (or silently none). -Now `"..."` is always an identifier and an unknown one throws `no such column`. Write string literals with single quotes (`WHERE name = 'bob'`), or better, bind them. This also affects views and triggers already stored in a database: one written with `"..."` strings now fails with `no such column` when it's used (an `INSERT` that fires such a trigger fails too). Table `DEFAULT`/`CHECK` clauses and partial-index `WHERE`s are still read leniently. For legacy SQL or schemas like that, opt back in per connection with `SQLite(path, doubleQuotedStrings: true)` or `SQLiteDatabaseConfiguration(path, doubleQuotedStrings: true)`; the generic `init(url:name:…)` always turns it off. SQLite older than 3.29 has no switch, so there the fallback stays on. +Now `"..."` is always an identifier and an unknown one throws `no such column`. Write string literals with single quotes (`WHERE name = 'bob'`), or better, bind them. This also affects views and triggers already stored in a database: one written with `"..."` strings now fails with `no such column` when it's used (an `INSERT` that fires such a trigger fails too). Table `DEFAULT` values and `CHECK` clauses and partial-index `WHERE`s are still read leniently in normal use, but not when the schema is re-parsed: a `"..."` string in a `CHECK` clause or a partial-index `WHERE` anywhere in the database makes every `.reconcileTable` that removes columns fail (the rebuild's `ALTER TABLE … RENAME` re-checks the whole schema), so reconcile such databases with `doubleQuotedStrings: true`. For legacy SQL or schemas like these, opt back in per connection with `SQLite(path, doubleQuotedStrings: true)` or `SQLiteDatabaseConfiguration(path, doubleQuotedStrings: true)`; the generic `init(url:name:…)` always turns it off. SQLite older than 3.29 has no switch, so there the fallback stays on. This stops misspelled names from failing silently. It doesn't make Dynamic field names safe to take from untrusted callers: a caller who picks both the field and the value can still match every row with real columns (`rowid > 0`, `name contains ""`), so checking which fields a caller may use is still the application's job. +## Migrating from 5.x + +6.0.0 is the Swift 6 rewrite of the package; 5.0.0 (2020) is on the `legacy` branch. The raw `SQLite`/`SQLiteStmt` API keeps its names and signatures, but these changes can affect you: + +- **Toolchain and platforms.** Swift tools 6.2 or newer; macOS 12+ (was 10.15+), iOS 15+ (newly declared). It depends on Perfect-CRUD 3.0.0, which has its own [breaking changes](https://github.com/PerfectlySoft/Perfect-CRUD/releases/tag/3.0.0). +- **Linux uses the system SQLite.** The Perfect-sqlite3-support dependency is gone; install `libsqlite3-dev` and `pkg-config` (the `PerfectCSQLite` target finds SQLite with `pkg-config`). +- **Double-quoted strings are identifiers** (see above). Raw SQL that writes string literals as `"..."`, and views or triggers already stored that way, now fail with `no such column`. So does a reconcile that removes columns when a `CHECK` clause or partial-index `WHERE` uses one. Switch to single quotes or bindings, or pass `doubleQuotedStrings: true`. +- **`.reconcileTable` reaches sub-tables.** Creating or reconciling a table now also creates and reconciles its sub-tables on every run, not only on the first create. A sub-table whose type has fewer properties than the table has columns loses those columns, and a rebuild drops that table's own indexes and triggers. Pass `.shallow` to leave sub-tables alone. The tables aren't reconciled in one transaction, so a failing step leaves earlier tables changed. `.dropTable` drops children before parents. +- **Reconcile rebuilds keep foreign keys.** Removing columns rebuilds the table with its FOREIGN KEYs and without cascading deletes into the tables that reference it (indexes and triggers on the table are still dropped). With `foreign_keys` on (the default), the rebuild throws and rolls back if `PRAGMA foreign_key_check` then finds any violation in the table or the tables referencing it, including violations that were there before; and inside a transaction it throws for a table that any table, itself included, references (`PRAGMA foreign_keys` can't be turned off there). An added `@ForeignKey` column gets a `REFERENCES` constraint, and a column whose name only changed case is renamed (SQLite 3.25+) instead of being dropped and re-added. +- **Generated SQL quotes every identifier**, escaping embedded `"`. Table and column names that are keywords (such as `order`) now work. +- **One statement per call.** `Database.sql` and Dynamic `execute`, even with `allowsMultipleStatements: true`, throw `SQLiteCRUDError` when the SQL has more than one statement; they used to run the first and silently drop the rest. Run each statement separately. +- **Unsigned values above `Int64.max`** throw `SQLiteCRUDError` when bound instead of trapping. +- **Duplicate result column names:** the first column wins (`SELECT a.id, b.id` reads `a.id`); 5.0.0's reader took the last. +- **`columnText` repairs invalid UTF-8** with U+FFFD replacement characters; 5.0.0 returned `""` for the whole value. +- **Async and pooling are new** (from Perfect-CRUD 3). `SQLiteDatabaseConfiguration` is `@unchecked Sendable`, so `DatabaseConnectionPool` and the `…Async` methods work with it; use each connection from one task at a time (see above). +- **The Dynamic API is new** (from Perfect-CRUD 3). `select`, `mutate` and `execute` work, and Dynamic rows fold column names case-insensitively, first wins. `DynamicResult.affectedRows` is always 0 and `insertedID` always nil on this connector. If you need them, read `changes()` or `lastInsertRowID()` on the connection (`SQLiteDatabaseConfiguration.sqlite`) right after the call. `lastInsertRowID()` (and `Insert.lastInsertId()`) return the rowid, which equals your primary key only for an `INTEGER PRIMARY KEY` column; tables CRUD creates declare an integer key as `INT PRIMARY KEY`, so there the rowid is a separate value. + ## Usage Example — raw SQLite API Let's assume you'd like to host a blog in Swift. First we need tables. Opening `./db/database` creates the SQLite file if it doesn't exist (the `db` directory must already exist), so we simply need to connect and add the tables. @@ -180,4 +211,4 @@ See `Sources/PerfectSQLite/SQLiteCRUD.swift` and the [Perfect-CRUD](https://gith ## Further Information -See `docs/` in this repository for the older generated API docs (raw `SQLite`/`SQLiteStmt` only), or the [Perfect-CRUD](https://github.com/PerfectlySoft/Perfect-CRUD) package for the ORM layer this package integrates with. +See the doc comments in `Sources/PerfectSQLite`, or the [Perfect-CRUD](https://github.com/PerfectlySoft/Perfect-CRUD) package for the ORM layer this package integrates with. diff --git a/Sources/PerfectSQLite/SQLiteCRUD.swift b/Sources/PerfectSQLite/SQLiteCRUD.swift index 01e51f7..f2d79fe 100644 --- a/Sources/PerfectSQLite/SQLiteCRUD.swift +++ b/Sources/PerfectSQLite/SQLiteCRUD.swift @@ -557,16 +557,30 @@ class SQLiteExeDelegate: SQLExeDelegate, @unchecked Sendable { let database: SQLite let statement: SQLiteStmt let columnMap: SQLiteColumnMap + // The columns a Dynamic row gets, in result order. + let dynamicColumns: [(name: String, position: Int)] init(_ db: SQLite, stat: SQLiteStmt) { database = db statement = stat + // When result columns share a name (`SELECT a.id, b.id`), the first one wins, as + // SQLite's own name lookup does. Dynamic rows are keyed case-insensitively + // (DynamicRow lowercases its keys, and CRUD 3.0.0 traps on keys that differ only in + // case), so there `id` and `ID` count as the same name too. var m = SQLiteColumnMap() + var dynamic: [(name: String, position: Int)] = [] + var dynamicSeen = Set() let count = statement.columnCount() for i in 0.. DynamicRow? { var values: [String: DynamicValue] = [:] - for (name, position) in columnMap { + for (name, position) in dynamicColumns { values[name] = sqliteDynamicValue(statement, position: position) } return DynamicRow(values) @@ -623,11 +637,11 @@ class SQLiteExeDelegate: SQLExeDelegate, @unchecked Sendable { case .integer(let i): try statement.bind(position: position, i) case .uinteger(let i): - try statement.bind(position: position, Int(i)) + try statement.bind(position: position, try sqliteInteger(i)) case .integer64(let i): try statement.bind(position: position, Int(i)) case .uinteger64(let i): - try statement.bind(position: position, Int(i)) + try statement.bind(position: position, try sqliteInteger(i)) case .integer32(let i): try statement.bind(position: position, Int(i)) case .uinteger32(let i): @@ -648,6 +662,14 @@ class SQLiteExeDelegate: SQLExeDelegate, @unchecked Sendable { } } +// SQLite integers are signed 64-bit. `Int(i)` trapped on an unsigned value above Int64.max. +func sqliteInteger(_ value: U) throws -> Int64 { + guard let i = Int64(exactly: value) else { + throw SQLiteCRUDError("Unsigned value \(value) doesn't fit in SQLite's 64-bit signed INTEGER.") + } + return i +} + func sqliteDynamicValue(_ statement: SQLiteStmt, position: Int) -> DynamicValue { if statement.isNull(position: position) { return .null @@ -661,12 +683,74 @@ func sqliteDynamicValue(_ statement: SQLiteStmt, position: Int) -> DynamicValue return .string(statement.columnText(position: position)) } -public struct SQLiteDatabaseConfiguration: DatabaseConfigurationProtocol { +extension SQLite { + // Prepares the first statement of `sql` and throws if another statement follows it. + // An SQLExeDelegate runs exactly one statement, and sqlite3_prepare_v2 stops after the + // first one, so `execute(DynamicSQL(..., allowsMultipleStatements: true))` used to run + // the first statement and silently drop the rest. Trailing whitespace, `;` and comments + // are fine: preparing them yields no statement. + func prepareSingle(statement sql: String) throws -> SQLiteStmt { + // SQLite stops reading at a NUL, so anything after one would be silently ignored. + guard !sql.utf8.contains(0) else { + throw SQLiteCRUDError("The SQL contains a NUL character: \(sql)") + } + let utf8 = Array(sql.utf8CString) + return try utf8.withUnsafeBufferPointer { buf -> SQLiteStmt in + guard let base = buf.baseAddress else { + throw SQLiteCRUDError("No SQL statement to run.") + } + let length = Int32(buf.count - 1) // without the NUL + var first: OpaquePointer? = nil + var tail: UnsafePointer? = nil + try checkRes(sqlite3_prepare_v2(sqlite3, base, length, &first, &tail)) + // Empty, whitespace-only and comment-only SQL prepares without error but gives no + // statement; running it would crash on the nil statement. + guard first != nil else { + throw SQLiteCRUDError("No SQL statement to run: \(sql)") + } + let stmt = SQLiteStmt(db: sqlite3, stat: first) + // Look for a statement after the first. Preparing the rest is the only reliable way + // to skip comments; a later statement that fails to prepare (it might name a table + // the first one creates) is still a second statement. + while let rest = tail, rest < base + Int(length) { + var next: OpaquePointer? = nil + var nextTail: UnsafePointer? = nil + let remaining = Int32(base + Int(length) - rest) + let res = sqlite3_prepare_v2(sqlite3, rest, remaining, &next, &nextTail) + if res != SQLITE_OK || next != nil { + sqlite3_finalize(next) + stmt.finalize() + throw SQLiteCRUDError("SQLite runs one statement at a time, but the SQL has more than one statement: \(sql)") + } + guard let nt = nextTail, nt > rest else { break } + tail = nt + } + return stmt + } + } +} + +// `@unchecked Sendable`, so it works with Perfect-CRUD's `DatabaseConnectionPool` and the +// `…Async` / `fetchAll()` methods, which need `C: Sendable`. Its stored properties are a +// `String` and the `SQLite` connection, a class around a raw `sqlite3*` with no locking of +// its own (also `@unchecked Sendable`). +// +// What makes that safe is using one connection from one task at a time. The async methods +// run the blocking work on Perfect-CRUD's dispatch queue while the caller waits, and the pool +// checks a connection out to one caller at a time, so a connection moves between threads but +// isn't used by two at once. SQLite allows that in its multi-thread mode, which is how the +// Apple SDKs build it (`sqlite3_threadsafe()` is 2), and in serialized mode (1, Ubuntu's +// libsqlite3). It isn't safe with a library built single-threaded (0). Connections are opened +// without SQLITE_OPEN_FULLMUTEX, so under multi-thread mode, using one connection (or one +// `Database` value) from two tasks at the same time is a data race in SQLite itself. Even +// where the library serializes calls, two tasks would interleave each other's statements and +// transactions. Give each concurrent task its own connection, for example from a pool. +public struct SQLiteDatabaseConfiguration: DatabaseConfigurationProtocol, @unchecked Sendable { public var sqlGenDelegate: SQLGenDelegate { return SQLiteGenDelegate(sqlite) } public func sqlExeDelegate(forSQL sql: String) throws -> SQLExeDelegate { - let prep = try sqlite.prepare(statement: sql) + let prep = try sqlite.prepareSingle(statement: sql) return SQLiteExeDelegate(sqlite, stat: prep) } public let name: String diff --git a/Tests/PerfectSQLiteTests/AsyncPoolTests.swift b/Tests/PerfectSQLiteTests/AsyncPoolTests.swift new file mode 100644 index 0000000..5768a07 --- /dev/null +++ b/Tests/PerfectSQLiteTests/AsyncPoolTests.swift @@ -0,0 +1,88 @@ +import Testing +import Foundation +import PerfectCRUD +@testable import PerfectSQLite + +// Perfect-CRUD's pool and async methods need `C: Sendable`. Before +// SQLiteDatabaseConfiguration conformed, none of this compiled. +@Suite(.serialized) struct AsyncPoolTests { + + let dbName = "/tmp/crud_sqlite_async_pool_test.db" + + struct AsyncRow: Codable, Sendable, TableNameProvider { + static let tableName = "async_row" + let id: Int + let name: String + } + + func reset() throws { + unlink(dbName) + let db = Database(configuration: try SQLiteDatabaseConfiguration(dbName)) + try db.create(AsyncRow.self, policy: .dropTable) + } + + @Test func asyncRoundTrip() async throws { + try reset() + let db = Database(configuration: try SQLiteDatabaseConfiguration(dbName)) + let table = db.table(AsyncRow.self) + try await table.insertAsync(AsyncRow(id: 1, name: "one")) + try await table.insertAsync([AsyncRow(id: 2, name: "two"), AsyncRow(id: 3, name: "three")]) + let inserted = try await db.transactionAsync { () throws -> Int in + try db.table(AsyncRow.self).insert(AsyncRow(id: 4, name: "four")) + return try db.table(AsyncRow.self).count() + } + #expect(inserted == 4) + // A failing transaction rolls back. + await #expect(throws: SQLiteCRUDError.self) { + try await db.transactionAsync { () throws -> Int in + try db.table(AsyncRow.self).insert(AsyncRow(id: 5, name: "five")) + throw SQLiteCRUDError("roll back") + } + } + let rows = try await table.order(by: \.id).fetchAll() + #expect(rows.map(\.id) == [1, 2, 3, 4]) + let three = try await table.where(\AsyncRow.id == 3).firstAsync() + #expect(three?.name == "three") + // CRUD 3.0.0 has updateAsync/deleteAsync only on a whole Table, not after where(), + // so a targeted change goes through transactionAsync. + try await db.transactionAsync { + try db.table(AsyncRow.self).where(\AsyncRow.id == 3).update(AsyncRow(id: 3, name: "THREE")) + try db.table(AsyncRow.self).where(\AsyncRow.id == 1).delete() + } + let names = try await db.sqlAsync(#"SELECT "id", "name" FROM "async_row" ORDER BY "id""#, AsyncRow.self) + #expect(names.map(\.name) == ["two", "THREE", "four"]) + } + + @Test func connectionPool() async throws { + try reset() + let path = dbName + let pool = try DatabaseConnectionPool( + configuration: .init(minConnections: 1, maxConnections: 3)) { + try SQLiteDatabaseConfiguration(path) + } + try await pool.prewarm() + // More concurrent tasks than connections: each gets a connection of its own + // while it runs, and the rest wait for one to come back. + try await withThrowingTaskGroup(of: Void.self) { group in + for id in 1...12 { + group.addTask { + try await pool.withConnection { db in + try await db.table(AsyncRow.self).insertAsync(AsyncRow(id: id, name: "row \(id)")) + } + } + } + try await group.waitForAll() + } + #expect(await pool.currentSize <= 3) + #expect(await pool.availableCount == pool.currentSize) + let count = try await pool.withConnection { db in + try await db.table(AsyncRow.self).fetchAll().count + } + #expect(count == 12) + // Manual acquire/release. + let conn = try await pool.acquire() + let ids = try Database(configuration: conn).table(AsyncRow.self).order(by: \.id).select().map(\.id) + await pool.release(conn) + #expect(ids == Array(1...12)) + } +} diff --git a/Tests/PerfectSQLiteTests/DynamicAPITests.swift b/Tests/PerfectSQLiteTests/DynamicAPITests.swift new file mode 100644 index 0000000..d8c3b02 --- /dev/null +++ b/Tests/PerfectSQLiteTests/DynamicAPITests.swift @@ -0,0 +1,146 @@ +import Testing +import Foundation +import PerfectCRUD +@testable import PerfectSQLite + +// Perfect-CRUD's Dynamic API (select / mutate / execute) on this connector. +@Suite(.serialized) struct DynamicAPITests { + + let dbName = "/tmp/crud_sqlite_dynamic_test.db" + struct Count: Codable { let c: Int } + + func makeDB() throws -> Database { + unlink(dbName) + let db = Database(configuration: try SQLiteDatabaseConfiguration(dbName)) + try db.sql(#"CREATE TABLE "dyn" ("id" INTEGER PRIMARY KEY, "name" TEXT, "n" INTEGER)"#) + try db.sql(#"INSERT INTO "dyn" ("id", "name", "n") VALUES (1, 'a', 10), (2, 'b', 20), (3, 'c', NULL)"#) + return db + } + + func count(_ db: Database) throws -> Int { + try db.sql(#"SELECT COUNT(*) AS c FROM "dyn""#, Count.self)[0].c + } + + @Test func sqlWithNoStatementThrows() throws { + let db = try makeDB() + // These used to crash on the nil statement SQLite returns for them. + for sql in ["", " ", ";", "-- comment", "/* comment */"] { + #expect(throws: SQLiteCRUDError.self, "\(sql)") { try db.sql(sql) } + #expect(throws: SQLiteCRUDError.self, "\(sql)") { + _ = try db.execute(DynamicSQL(sql: sql, allowsMultipleStatements: true)) + } + } + } + + @Test func sqlWithEmbeddedNULThrows() throws { + let db = try makeDB() + // SQLite stops at a NUL, so the DELETE would be silently ignored. + #expect(throws: SQLiteCRUDError.self) { + _ = try db.execute(DynamicSQL(sql: "SELECT 1\0; DELETE FROM \"dyn\"", allowsMultipleStatements: true)) + } + #expect(try count(db) == 3) + } + + @Test func dynamicSelectReturnsRows() throws { + let db = try makeDB() + let all = try db.select(DynamicQuery(table: "dyn", orderings: [.init(field: "id")])) + #expect(all.rows.count == 3) + #expect(all.rows[0]["id"] == .int(1)) + #expect(all.rows[0]["name"] == .string("a")) + #expect(all.rows[2]["n"] == .null) + let some = try db.select(DynamicQuery( + table: "dyn", fields: ["name"], + predicates: [.init(field: "n", comparison: .greaterThan, value: .int(15))])) + #expect(some.rows == [DynamicRow(["name": .string("b")])]) + } + + @Test func dynamicExecuteReturnsRows() throws { + let db = try makeDB() + let result = try db.execute(DynamicSQL( + sql: #"SELECT "id", "name" FROM "dyn" WHERE "id" >= ? ORDER BY "id""#, + bindings: [.int(2)])) + #expect(result.rows.map { $0["id"] } == [.int(2), .int(3)]) + #expect(result.rows.map { $0["name"] } == [.string("b"), .string("c")]) + // A single statement with a trailing `;` and comment is still one statement. + let one = try db.execute(DynamicSQL(sql: "SELECT 1 AS x; -- done\n ", allowsMultipleStatements: true)) + #expect(one.rows == [DynamicRow(["x": .int(1)])]) + } + + // sqlite3_prepare_v2 stops after the first statement, so with + // allowsMultipleStatements the second INSERT used to be dropped silently. + @Test func dynamicExecuteRefusesMultipleStatements() throws { + let db = try makeDB() + let sql = #"INSERT INTO "dyn" ("id") VALUES (10); INSERT INTO "dyn" ("id") VALUES (11)"# + let error = #expect(throws: SQLiteCRUDError.self) { + try db.execute(DynamicSQL(sql: sql, allowsMultipleStatements: true)) + } + #expect(error?.description.contains("more than one statement") == true) + #expect(try count(db) == 3) // neither statement ran + // A second statement that can't be prepared yet (its table doesn't exist) is + // still refused rather than ignored. + #expect(throws: SQLiteCRUDError.self) { + try db.execute(DynamicSQL( + sql: #"CREATE TABLE "later" ("id" INTEGER); INSERT INTO "later" VALUES (1)"#, + allowsMultipleStatements: true)) + } + #expect(throws: SQLiteCRUDError.self) { + try db.sql(#"DELETE FROM "dyn" WHERE "id" = 1; /* c */ DELETE FROM "dyn""#) + } + #expect(try count(db) == 3) + } + + // `.uint` binds as CRUD's `.uinteger64`; above Int64.max it used to trap in `Int(i)`. + @Test func unsignedValuesOutOfRangeThrow() throws { + let db = try makeDB() + let max = Int64.max + _ = try db.mutate(DynamicMutation(action: .insert, table: "dyn", + values: ["id": .int(4), "n": .uint(UInt64(max))])) + let row = try db.select(DynamicQuery( + table: "dyn", predicates: [.init(field: "id", comparison: .equal, value: .int(4))])) + #expect(row.rows.first?["n"] == .int(max)) + let error = #expect(throws: SQLiteCRUDError.self) { + try db.mutate(DynamicMutation(action: .insert, table: "dyn", + values: ["id": .int(5), "n": .uint(UInt64.max)])) + } + #expect(error?.description.contains("doesn't fit") == true) + #expect(throws: SQLiteCRUDError.self) { + try db.execute(DynamicSQL(sql: "SELECT ? AS x", bindings: [.uint(UInt64(max) + 1)])) + } + // A typed comparison with a UInt binds `.uinteger`, which trapped the same way. + struct Unsigned: Codable, TableNameProvider { + static let tableName = "dyn_unsigned" + let id: Int + let u: UInt + } + try db.sql(#"CREATE TABLE "dyn_unsigned" ("id" INTEGER PRIMARY KEY, "u" INTEGER)"#) + try db.sql(#"INSERT INTO "dyn_unsigned" VALUES (1, 5)"#) + #expect(try db.table(Unsigned.self).where(\Unsigned.u < UInt(6)).count() == 1) + #expect(throws: SQLiteCRUDError.self) { + try db.table(Unsigned.self).where(\Unsigned.u < UInt.max).count() + } + // Typed UInt/UInt64 properties don't reach this code: CRUD 3.0.0's encoder converts + // them to `.integer(Int(value))` itself (and traps there above Int.max). + } + + // Duplicate result column names used to keep the LAST column's value, and names that + // differ only in case reached CRUD 3.0.0's DynamicRow.init, which traps on them. + @Test func duplicateColumnNamesKeepTheFirst() throws { + let db = try makeDB() + try db.sql(#"CREATE TABLE "dyn_other" ("id" INTEGER PRIMARY KEY, "dynId" INTEGER)"#) + try db.sql(#"INSERT INTO "dyn_other" VALUES (100, 2)"#) + let joined = #"SELECT a."id", b."id" FROM "dyn" a JOIN "dyn_other" b ON b."dynId" = a."id""# + #expect(try db.execute(DynamicSQL(sql: joined)).rows == [DynamicRow(["id": .int(2)])]) + #expect(try db.execute(DynamicSQL(sql: "SELECT 1 AS x, 2 AS x")).rows + == [DynamicRow(["x": .int(1)])]) + #expect(try db.execute(DynamicSQL(sql: "SELECT 1 AS a, 2 AS A, 3 AS b")).rows + == [DynamicRow(["a": .int(1), "b": .int(3)])]) + // Dynamic select goes through the same reader. + let select = try db.select(DynamicQuery( + table: "dyn", fields: ["id", "ID", "name"], + predicates: [.init(field: "id", comparison: .equal, value: .int(1))])) + #expect(select.rows == [DynamicRow(["id": .int(1), "name": .string("a")])]) + // The typed reader also takes the first of two same-named columns. + struct X: Codable { let x: Int } + #expect(try db.sql("SELECT 1 AS x, 2 AS x", X.self).map(\.x) == [1]) + } +} diff --git a/docs/Classes.html b/docs/Classes.html deleted file mode 100644 index 556c54f..0000000 --- a/docs/Classes.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - Classes Reference - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

Classes

-

The following classes are available globally.

- -
-
-
-
    -
  • -
    - - - - SQLite - -
    -
    -
    -
    -
    -
    -

    A SQLite database

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public class SQLite
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - SQLiteStmt - -
    -
    -
    -
    -
    -
    -

    A compiled SQLite statement

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public class SQLiteStmt
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Classes/SQLite.html b/docs/Classes/SQLite.html deleted file mode 100644 index c012ff2..0000000 --- a/docs/Classes/SQLite.html +++ /dev/null @@ -1,760 +0,0 @@ - - - - SQLite Class Reference - - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

SQLite

-
-
-
public class SQLite
- -
-
-

A SQLite database

- -
-
-
-
    -
  • -
    - - - - init(_:readOnly:) - -
    -
    -
    -
    -
    -
    -

    Create or open a SQLite database given a file path.

    - -
    -

    Throws

    - SQLiteError - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init(_ path: String, readOnly: Bool = false) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - path - - -
    -

    String path to SQLite database

    - -
    -
    - - readOnly - - -
    -

    Optional, Bool flag for read/write setting, defaults to false

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - close() - -
    -
    -
    -
    -
    -
    -

    Close the SQLite database.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func close()
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - prepare(statement:) - -
    -
    -
    -
    -
    -
    -

    Compile the SQL statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func prepare(statement stat: String) throws -> SQLiteStmt
    - -
    -
    -
    -

    Return Value

    -

    A SQLiteStmt object representing the compiled statement.

    - -
    -
    -
    -
  • -
  • -
    - - - - lastInsertRowID() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_last_insert_rowid.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func lastInsertRowID() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int last inserted row ID

    - -
    -
    -
    -
  • -
  • -
    - - - - totalChanges() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_total_changes.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func totalChanges() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int total changes

    - -
    -
    -
    -
  • -
  • -
    - - - - changes() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_changes.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func changes() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int number of changes

    - -
    -
    -
    -
  • -
  • -
    - - - - errCode() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_errcode.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func errCode() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int error code

    - -
    -
    -
    -
  • -
  • -
    - - - - errMsg() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_errmsg.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func errMsg() -> String
    - -
    -
    -
    -

    Return Value

    -

    String error message

    - -
    -
    -
    -
  • -
  • -
    - - - - execute(statement:) - -
    -
    -
    -
    -
    -
    -

    Execute the given statement. Assumes there will be no parameter binding or resulting row data.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func execute(statement statement: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Execute the given statement. Calls the provided callback one time for parameter binding. Assumes there will be no resulting row data.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func execute(statement statement: String, doBindings: (SQLiteStmt) throws -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - doBindings - - -
    -

    Block used for bindings

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Execute the given statement count times. Calls the provided callback on each execution for parameter binding. Assumes there will be no resulting row data.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func execute(statement statement: String, count: Int, doBindings: (SQLiteStmt, Int) throws -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - count - - -
    -

    Int number of times to execute

    - -
    -
    - - doBindings - - -
    -

    Block to be executed for binding on each call

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - doWithTransaction(_:) - -
    -
    -
    -
    -
    -
    -

    Executes a BEGIN, calls the provided closure and executes a ROLLBACK if an exception occurs or a COMMIT if no exception occurs.

    - -
    -

    Throws

    - ErrorType - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func doWithTransaction(closure: () throws -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - closure - - -
    -

    Block to be executed inside transaction

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Executes the statement and calls the closure for each resulting row.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func forEachRow(statement statement: String, handleRow: (SQLiteStmt, Int) -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - handleRow - - -
    -

    Block to be executed for each row

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Executes the statement, calling doBindings to handle parameter bindings and calling handleRow for each resulting row.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func forEachRow(statement statement: String, doBindings: (SQLiteStmt) throws -> (), handleRow: (SQLiteStmt, Int) -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - doBindings - - -
    -

    Block to perform bindings on statement

    - -
    -
    - - handleRow - - -
    -

    Block to execute for each row

    - -
    -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Classes/SQLiteStmt.html b/docs/Classes/SQLiteStmt.html deleted file mode 100644 index ab3061e..0000000 --- a/docs/Classes/SQLiteStmt.html +++ /dev/null @@ -1,1726 +0,0 @@ - - - - SQLiteStmt Class Reference - - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

SQLiteStmt

-
-
-
public class SQLiteStmt
- -
-
-

A compiled SQLite statement

- -
-
-
-
    -
  • -
    - - - - close() - -
    -
    -
    -
    -
    -
    -

    Close or finalize the statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func close()
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - finalize() - -
    -
    -
    -
    -
    -
    -

    Close the statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func finalize()
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - step() - -
    -
    -
    -
    -
    -
    -

    Advance to the next row.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func step() -> Int32
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Double value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ d: Double) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - d - - -
    -

    Double to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int32 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ i: Int32) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - i - - -
    -

    Int32 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ i: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - i - - -
    -

    Int to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int64 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ i: Int64) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - i - - -
    -

    Int64 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the String value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ s: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - s - - -
    -

    String to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the [Int8] blob value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ b: [Int8]) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - b - - -
    -

    [Int8] blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the [UInt8] blob value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ b: [UInt8]) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - b - - -
    -

    [UInt8] blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Bind a blob of count zero values to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindZeroBlob(position position: Int, count: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - count - - -
    -

    Int number of zero values in blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bindNull(position:) - -
    -
    -
    -
    -
    -
    -

    Bind a null to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindNull(position position: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Double value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ d: Double) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - d - - -
    -

    Double to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int32 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ i: Int32) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - i - - -
    -

    Int32 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ i: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - i - - -
    -

    Int to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int64 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ i: Int64) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - i - - -
    -

    Int64 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the String value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ s: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - s - - -
    -

    String to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the [Int8] blob value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ b: [Int8]) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - b - - -
    -

    [Int8] blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Bind a blob of count zero values to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindZeroBlob(name: String, count: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - count - - -
    -

    Int number of zero values in blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bindNull(name:) - -
    -
    -
    -
    -
    -
    -

    Bind a null to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindNull(name name: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the index for the named parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindParameterIndex(name name: String) throws -> Int
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    -
    -
    -

    Return Value

    -

    Int index of parameter

    - -
    -
    -
    -
  • -
  • -
    - - - - reset() - -
    -
    -
    -
    -
    -
    -

    Resets the SQL statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func reset() throws -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int result

    - -
    -
    -
    -
  • -
  • -
    - - - - columnCount() - -
    -
    -
    -
    -
    -
    -

    Return the number of columns in mthe result set.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnCount() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int count of columns in result set

    - -
    -
    -
    -
  • -
  • -
    - - - - columnName(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the name for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnName(position position: Int) -> String
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of column

    - -
    -
    -
    -
    -

    Return Value

    -

    String name of column

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the name of the declared type for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnDeclType(position position: Int) -> String
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of column

    - -
    -
    -
    -
    -

    Return Value

    -

    String name of declared type

    - -
    -
    -
    -
  • -
  • -
    - - - - columnBlob(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the blob data for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnBlob(position position: Int) -> [Int8]
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of column

    - -
    -
    -
    -
    -

    Return Value

    -

    [Int8] blob

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the Double value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnDouble(position position: Int) -> Double
    - -
    -
    -
    -

    Return Value

    -

    Double value for column

    - -
    -
    -
    -
  • -
  • -
    - - - - columnInt(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the Int value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnInt(position position: Int) -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int value for column

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the Int32 value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnInt32(position position: Int) -> Int32
    - -
    -
    -
    -

    Return Value

    -

    Int32 value for column

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the Int64 value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnInt64(position position: Int) -> Int64
    - -
    -
    -
    -

    Return Value

    -

    Int64 value for column

    - -
    -
    -
    -
  • -
  • -
    - - - - columnText(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the String value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnText(position position: Int) -> String
    - -
    -
    -
    -

    Return Value

    -

    String value for column

    - -
    -
    -
    -
  • -
  • -
    - - - - columnType(_:) - -
    -
    -
    -
    -
    -
    -

    Returns the type for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnType(position: Int) -> Int32
    - -
    -
    -
    -

    Return Value

    -

    Int32

    - -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Enums.html b/docs/Enums.html deleted file mode 100644 index 5c7058b..0000000 --- a/docs/Enums.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - Enums Reference - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

Enums

-

The following enums are available globally.

- -
-
-
-
    -
  • -
    - - - - SQLiteError - -
    -
    -
    -
    -
    -
    -

    This enum type indicates an exception when dealing with a SQLite database

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public enum SQLiteError : ErrorProtocol
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/Enums/SQLiteError.html b/docs/Enums/SQLiteError.html deleted file mode 100644 index d56dced..0000000 --- a/docs/Enums/SQLiteError.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - SQLiteError Enum Reference - - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

SQLiteError

-
-
-
public enum SQLiteError : ErrorProtocol
- -
-
-

This enum type indicates an exception when dealing with a SQLite database

- -
-
-
-
    -
  • -
    - - - - Error - -
    -
    -
    -
    -
    -
    -

    A SQLite error code and message.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case Error(code: Int, msg: String)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/css/highlight.css b/docs/css/highlight.css deleted file mode 100644 index d0db0e1..0000000 --- a/docs/css/highlight.css +++ /dev/null @@ -1,200 +0,0 @@ -/* Credit to https://gist.github.com/wataru420/2048287 */ -.highlight { - /* Comment */ - /* Error */ - /* Keyword */ - /* Operator */ - /* Comment.Multiline */ - /* Comment.Preproc */ - /* Comment.Single */ - /* Comment.Special */ - /* Generic.Deleted */ - /* Generic.Deleted.Specific */ - /* Generic.Emph */ - /* Generic.Error */ - /* Generic.Heading */ - /* Generic.Inserted */ - /* Generic.Inserted.Specific */ - /* Generic.Output */ - /* Generic.Prompt */ - /* Generic.Strong */ - /* Generic.Subheading */ - /* Generic.Traceback */ - /* Keyword.Constant */ - /* Keyword.Declaration */ - /* Keyword.Pseudo */ - /* Keyword.Reserved */ - /* Keyword.Type */ - /* Literal.Number */ - /* Literal.String */ - /* Name.Attribute */ - /* Name.Builtin */ - /* Name.Class */ - /* Name.Constant */ - /* Name.Entity */ - /* Name.Exception */ - /* Name.Function */ - /* Name.Namespace */ - /* Name.Tag */ - /* Name.Variable */ - /* Operator.Word */ - /* Text.Whitespace */ - /* Literal.Number.Float */ - /* Literal.Number.Hex */ - /* Literal.Number.Integer */ - /* Literal.Number.Oct */ - /* Literal.String.Backtick */ - /* Literal.String.Char */ - /* Literal.String.Doc */ - /* Literal.String.Double */ - /* Literal.String.Escape */ - /* Literal.String.Heredoc */ - /* Literal.String.Interpol */ - /* Literal.String.Other */ - /* Literal.String.Regex */ - /* Literal.String.Single */ - /* Literal.String.Symbol */ - /* Name.Builtin.Pseudo */ - /* Name.Variable.Class */ - /* Name.Variable.Global */ - /* Name.Variable.Instance */ - /* Literal.Number.Integer.Long */ } - .highlight .c { - color: #999988; - font-style: italic; } - .highlight .err { - color: #a61717; - background-color: #e3d2d2; } - .highlight .k { - color: #000000; - font-weight: bold; } - .highlight .o { - color: #000000; - font-weight: bold; } - .highlight .cm { - color: #999988; - font-style: italic; } - .highlight .cp { - color: #999999; - font-weight: bold; } - .highlight .c1 { - color: #999988; - font-style: italic; } - .highlight .cs { - color: #999999; - font-weight: bold; - font-style: italic; } - .highlight .gd { - color: #000000; - background-color: #ffdddd; } - .highlight .gd .x { - color: #000000; - background-color: #ffaaaa; } - .highlight .ge { - color: #000000; - font-style: italic; } - .highlight .gr { - color: #aa0000; } - .highlight .gh { - color: #999999; } - .highlight .gi { - color: #000000; - background-color: #ddffdd; } - .highlight .gi .x { - color: #000000; - background-color: #aaffaa; } - .highlight .go { - color: #888888; } - .highlight .gp { - color: #555555; } - .highlight .gs { - font-weight: bold; } - .highlight .gu { - color: #aaaaaa; } - .highlight .gt { - color: #aa0000; } - .highlight .kc { - color: #000000; - font-weight: bold; } - .highlight .kd { - color: #000000; - font-weight: bold; } - .highlight .kp { - color: #000000; - font-weight: bold; } - .highlight .kr { - color: #000000; - font-weight: bold; } - .highlight .kt { - color: #445588; } - .highlight .m { - color: #009999; } - .highlight .s { - color: #d14; } - .highlight .na { - color: #008080; } - .highlight .nb { - color: #0086B3; } - .highlight .nc { - color: #445588; - font-weight: bold; } - .highlight .no { - color: #008080; } - .highlight .ni { - color: #800080; } - .highlight .ne { - color: #990000; - font-weight: bold; } - .highlight .nf { - color: #990000; } - .highlight .nn { - color: #555555; } - .highlight .nt { - color: #000080; } - .highlight .nv { - color: #008080; } - .highlight .ow { - color: #000000; - font-weight: bold; } - .highlight .w { - color: #bbbbbb; } - .highlight .mf { - color: #009999; } - .highlight .mh { - color: #009999; } - .highlight .mi { - color: #009999; } - .highlight .mo { - color: #009999; } - .highlight .sb { - color: #d14; } - .highlight .sc { - color: #d14; } - .highlight .sd { - color: #d14; } - .highlight .s2 { - color: #d14; } - .highlight .se { - color: #d14; } - .highlight .sh { - color: #d14; } - .highlight .si { - color: #d14; } - .highlight .sx { - color: #d14; } - .highlight .sr { - color: #009926; } - .highlight .s1 { - color: #d14; } - .highlight .ss { - color: #990073; } - .highlight .bp { - color: #999999; } - .highlight .vc { - color: #008080; } - .highlight .vg { - color: #008080; } - .highlight .vi { - color: #008080; } - .highlight .il { - color: #009999; } diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css deleted file mode 100644 index d6d65b7..0000000 --- a/docs/css/jazzy.css +++ /dev/null @@ -1,332 +0,0 @@ -html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { - background: transparent; - border: 0; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; } - -body { - background-color: #f2f2f2; - font-family: Helvetica, freesans, Arial, sans-serif; - font-size: 14px; - -webkit-font-smoothing: subpixel-antialiased; - word-wrap: break-word; } - -h1, h2, h3 { - margin-top: 0.8em; - margin-bottom: 0.3em; - font-weight: 100; - color: black; } - -h1 { - font-size: 2.5em; } - -h2 { - font-size: 2em; - border-bottom: 1px solid #e2e2e2; } - -h4 { - font-size: 13px; - line-height: 1.5; - margin-top: 21px; } - -h5 { - font-size: 1.1em; } - -h6 { - font-size: 1.1em; - color: #777; } - -.section-name { - color: gray; - display: block; - font-family: Helvetica; - font-size: 22px; - font-weight: 100; - margin-bottom: 15px; } - -pre, code { - font: 0.95em Menlo, monospace; - color: #777; - word-wrap: normal; } - -p code, li code { - background-color: #eee; - padding: 2px 4px; - border-radius: 4px; } - -a { - color: #0088cc; - text-decoration: none; } - -ul { - padding-left: 15px; } - -li { - line-height: 1.8em; } - -img { - max-width: 100%; } - -blockquote { - margin-left: 0; - padding: 0 10px; - border-left: 4px solid #ccc; } - -.content-wrapper { - margin: 0 auto; - width: 980px; } - -header { - font-size: 0.85em; - line-height: 26px; - background-color: #414141; - position: fixed; - width: 100%; - z-index: 1; } - header img { - padding-right: 6px; - vertical-align: -4px; - height: 16px; } - header a { - color: #fff; } - header p { - float: left; - color: #999; } - header .header-right { - float: right; - margin-left: 16px; } - -#breadcrumbs { - background-color: #f2f2f2; - height: 27px; - padding-top: 17px; - position: fixed; - width: 100%; - z-index: 1; - margin-top: 26px; } - #breadcrumbs #carat { - height: 10px; - margin: 0 5px; } - -.sidebar { - background-color: #f9f9f9; - border: 1px solid #e2e2e2; - overflow-y: auto; - overflow-x: hidden; - position: fixed; - top: 70px; - bottom: 0; - width: 230px; - word-wrap: normal; } - -.nav-groups { - list-style-type: none; - background: #fff; - padding-left: 0; } - -.nav-group-name { - border-bottom: 1px solid #e2e2e2; - font-size: 1.1em; - font-weight: 100; - padding: 15px 0 15px 20px; } - .nav-group-name > a { - color: #333; } - -.nav-group-tasks { - margin-top: 5px; } - -.nav-group-task { - font-size: 0.9em; - list-style-type: none; - white-space: nowrap; } - .nav-group-task a { - color: #888; } - -.main-content { - background-color: #fff; - border: 1px solid #e2e2e2; - margin-left: 246px; - position: absolute; - overflow: hidden; - padding-bottom: 60px; - top: 70px; - width: 734px; } - .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { - margin-bottom: 1em; } - .main-content p { - line-height: 1.8em; } - .main-content section .section:first-child { - margin-top: 0; - padding-top: 0; } - .main-content section .task-group-section .task-group:first-of-type { - padding-top: 10px; } - .main-content section .task-group-section .task-group:first-of-type .section-name { - padding-top: 15px; } - -.section { - padding: 0 25px; } - -.highlight { - background-color: #eee; - padding: 10px 12px; - border: 1px solid #e2e2e2; - border-radius: 4px; - overflow-x: auto; } - -.declaration .highlight { - overflow-x: initial; - padding: 0 40px 40px 0; - margin-bottom: -25px; - background-color: transparent; - border: none; } - -.section-name { - margin: 0; - margin-left: 18px; } - -.task-group-section { - padding-left: 6px; - border-top: 1px solid #e2e2e2; } - -.task-group { - padding-top: 0px; } - -.task-name-container a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - -.item { - padding-top: 8px; - width: 100%; - list-style-type: none; } - .item a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - .item code { - background-color: transparent; - padding: 0; } - .item .token { - padding-left: 3px; - margin-left: 15px; - font-size: 11.9px; } - .item .declaration-note { - font-size: .85em; - color: gray; - font-style: italic; } - -.pointer-container { - border-bottom: 1px solid #e2e2e2; - left: -23px; - padding-bottom: 13px; - position: relative; - width: 110%; } - -.pointer { - background: #f9f9f9; - border-left: 1px solid #e2e2e2; - border-top: 1px solid #e2e2e2; - height: 12px; - left: 21px; - top: -7px; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - position: absolute; - width: 12px; } - -.height-container { - display: none; - left: -25px; - padding: 0 25px; - position: relative; - width: 100%; - overflow: hidden; } - .height-container .section { - background: #f9f9f9; - border-bottom: 1px solid #e2e2e2; - left: -25px; - position: relative; - width: 100%; - padding-top: 10px; - padding-bottom: 5px; } - -.aside, .language { - padding: 6px 12px; - margin: 12px 0; - border-left: 5px solid #dddddd; - overflow-y: hidden; } - .aside .aside-title, .language .aside-title { - font-size: 9px; - letter-spacing: 2px; - text-transform: uppercase; - padding-bottom: 0; - margin: 0; - color: #aaa; - -webkit-user-select: none; } - .aside p:last-child, .language p:last-child { - margin-bottom: 0; } - -.language { - border-left: 5px solid #cde9f4; } - .language .aside-title { - color: #4b8afb; } - -.aside-warning { - border-left: 5px solid #ff6666; } - .aside-warning .aside-title { - color: #ff0000; } - -.graybox { - border-collapse: collapse; - width: 100%; } - .graybox p { - margin: 0; - word-break: break-word; - min-width: 50px; } - .graybox td { - border: 1px solid #e2e2e2; - padding: 5px 25px 5px 10px; - vertical-align: middle; } - .graybox tr td:first-of-type { - text-align: right; - padding: 7px; - vertical-align: top; - word-break: normal; - width: 40px; } - -.slightly-smaller { - font-size: 0.9em; } - -#footer { - position: absolute; - bottom: 10px; - margin-left: 25px; } - #footer p { - margin: 0; - color: #aaa; - font-size: 0.8em; } - -html.dash header, html.dash #breadcrumbs, html.dash .sidebar { - display: none; } -html.dash .main-content { - width: 980px; - margin-left: 0; - border: none; - width: 100%; - top: 0; - padding-bottom: 0; } -html.dash .height-container { - display: block; } -html.dash .item .token { - margin-left: 0; } -html.dash .content-wrapper { - width: auto; } -html.dash #footer { - position: static; } diff --git a/docs/docsets/.docset/Contents/Info.plist b/docs/docsets/.docset/Contents/Info.plist deleted file mode 100644 index 4fcbfbd..0000000 --- a/docs/docsets/.docset/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleIdentifier - com.jazzy. - CFBundleName - - DocSetPlatformFamily - jazzy - isDashDocset - - dashIndexFilePath - index.html - isJavaScriptEnabled - - DashDocSetFamily - dashtoc - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html deleted file mode 100644 index 556c54f..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - Classes Reference - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

Classes

-

The following classes are available globally.

- -
-
-
-
    -
  • -
    - - - - SQLite - -
    -
    -
    -
    -
    -
    -

    A SQLite database

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public class SQLite
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - SQLiteStmt - -
    -
    -
    -
    -
    -
    -

    A compiled SQLite statement

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public class SQLiteStmt
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/SQLite.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/SQLite.html deleted file mode 100644 index c012ff2..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/SQLite.html +++ /dev/null @@ -1,760 +0,0 @@ - - - - SQLite Class Reference - - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

SQLite

-
-
-
public class SQLite
- -
-
-

A SQLite database

- -
-
-
-
    -
  • -
    - - - - init(_:readOnly:) - -
    -
    -
    -
    -
    -
    -

    Create or open a SQLite database given a file path.

    - -
    -

    Throws

    - SQLiteError - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public init(_ path: String, readOnly: Bool = false) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - path - - -
    -

    String path to SQLite database

    - -
    -
    - - readOnly - - -
    -

    Optional, Bool flag for read/write setting, defaults to false

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - close() - -
    -
    -
    -
    -
    -
    -

    Close the SQLite database.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func close()
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - prepare(statement:) - -
    -
    -
    -
    -
    -
    -

    Compile the SQL statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func prepare(statement stat: String) throws -> SQLiteStmt
    - -
    -
    -
    -

    Return Value

    -

    A SQLiteStmt object representing the compiled statement.

    - -
    -
    -
    -
  • -
  • -
    - - - - lastInsertRowID() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_last_insert_rowid.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func lastInsertRowID() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int last inserted row ID

    - -
    -
    -
    -
  • -
  • -
    - - - - totalChanges() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_total_changes.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func totalChanges() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int total changes

    - -
    -
    -
    -
  • -
  • -
    - - - - changes() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_changes.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func changes() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int number of changes

    - -
    -
    -
    -
  • -
  • -
    - - - - errCode() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_errcode.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func errCode() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int error code

    - -
    -
    -
    -
  • -
  • -
    - - - - errMsg() - -
    -
    -
    -
    -
    -
    -

    Returns the value of sqlite3_errmsg.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func errMsg() -> String
    - -
    -
    -
    -

    Return Value

    -

    String error message

    - -
    -
    -
    -
  • -
  • -
    - - - - execute(statement:) - -
    -
    -
    -
    -
    -
    -

    Execute the given statement. Assumes there will be no parameter binding or resulting row data.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func execute(statement statement: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Execute the given statement. Calls the provided callback one time for parameter binding. Assumes there will be no resulting row data.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func execute(statement statement: String, doBindings: (SQLiteStmt) throws -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - doBindings - - -
    -

    Block used for bindings

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Execute the given statement count times. Calls the provided callback on each execution for parameter binding. Assumes there will be no resulting row data.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func execute(statement statement: String, count: Int, doBindings: (SQLiteStmt, Int) throws -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - count - - -
    -

    Int number of times to execute

    - -
    -
    - - doBindings - - -
    -

    Block to be executed for binding on each call

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - doWithTransaction(_:) - -
    -
    -
    -
    -
    -
    -

    Executes a BEGIN, calls the provided closure and executes a ROLLBACK if an exception occurs or a COMMIT if no exception occurs.

    - -
    -

    Throws

    - ErrorType - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func doWithTransaction(closure: () throws -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - closure - - -
    -

    Block to be executed inside transaction

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Executes the statement and calls the closure for each resulting row.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func forEachRow(statement statement: String, handleRow: (SQLiteStmt, Int) -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - handleRow - - -
    -

    Block to be executed for each row

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Executes the statement, calling doBindings to handle parameter bindings and calling handleRow for each resulting row.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func forEachRow(statement statement: String, doBindings: (SQLiteStmt) throws -> (), handleRow: (SQLiteStmt, Int) -> ()) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - - - - - -
    - - statement - - -
    -

    String statement to be executed

    - -
    -
    - - doBindings - - -
    -

    Block to perform bindings on statement

    - -
    -
    - - handleRow - - -
    -

    Block to execute for each row

    - -
    -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/SQLiteStmt.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/SQLiteStmt.html deleted file mode 100644 index ab3061e..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Classes/SQLiteStmt.html +++ /dev/null @@ -1,1726 +0,0 @@ - - - - SQLiteStmt Class Reference - - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

SQLiteStmt

-
-
-
public class SQLiteStmt
- -
-
-

A compiled SQLite statement

- -
-
-
-
    -
  • -
    - - - - close() - -
    -
    -
    -
    -
    -
    -

    Close or finalize the statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func close()
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - finalize() - -
    -
    -
    -
    -
    -
    -

    Close the statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func finalize()
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - step() - -
    -
    -
    -
    -
    -
    -

    Advance to the next row.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func step() -> Int32
    - -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Double value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ d: Double) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - d - - -
    -

    Double to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int32 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ i: Int32) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - i - - -
    -

    Int32 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ i: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - i - - -
    -

    Int to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int64 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ i: Int64) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - i - - -
    -

    Int64 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the String value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ s: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - s - - -
    -

    String to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the [Int8] blob value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ b: [Int8]) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - b - - -
    -

    [Int8] blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(position:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the [UInt8] blob value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(position position: Int, _ b: [UInt8]) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - b - - -
    -

    [UInt8] blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Bind a blob of count zero values to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindZeroBlob(position position: Int, count: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    - - count - - -
    -

    Int number of zero values in blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bindNull(position:) - -
    -
    -
    -
    -
    -
    -

    Bind a null to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindNull(position position: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of binding

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Double value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ d: Double) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - d - - -
    -

    Double to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int32 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ i: Int32) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - i - - -
    -

    Int32 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ i: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - i - - -
    -

    Int to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the Int64 value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ i: Int64) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - i - - -
    -

    Int64 to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the String value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ s: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - s - - -
    -

    String to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bind(name:_:) - -
    -
    -
    -
    -
    -
    -

    Bind the [Int8] blob value to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bind(name name: String, _ b: [Int8]) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - b - - -
    -

    [Int8] blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Bind a blob of count zero values to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindZeroBlob(name: String, count: Int) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    - - count - - -
    -

    Int number of zero values in blob to be bound

    - -
    -
    -
    -
    -
    -
  • -
  • -
    - - - - bindNull(name:) - -
    -
    -
    -
    -
    -
    -

    Bind a null to the indicated parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindNull(name name: String) throws
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the index for the named parameter.

    - -
    -

    Throws

    - () - -
    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func bindParameterIndex(name name: String) throws -> Int
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - name - - -
    -

    String name of binding

    - -
    -
    -
    -
    -

    Return Value

    -

    Int index of parameter

    - -
    -
    -
    -
  • -
  • -
    - - - - reset() - -
    -
    -
    -
    -
    -
    -

    Resets the SQL statement.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func reset() throws -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int result

    - -
    -
    -
    -
  • -
  • -
    - - - - columnCount() - -
    -
    -
    -
    -
    -
    -

    Return the number of columns in mthe result set.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnCount() -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int count of columns in result set

    - -
    -
    -
    -
  • -
  • -
    - - - - columnName(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the name for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnName(position position: Int) -> String
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of column

    - -
    -
    -
    -
    -

    Return Value

    -

    String name of column

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the name of the declared type for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnDeclType(position position: Int) -> String
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of column

    - -
    -
    -
    -
    -

    Return Value

    -

    String name of declared type

    - -
    -
    -
    -
  • -
  • -
    - - - - columnBlob(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the blob data for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnBlob(position position: Int) -> [Int8]
    - -
    -
    -
    -

    Parameters

    - - - - - - - -
    - - position - - -
    -

    Int position of column

    - -
    -
    -
    -
    -

    Return Value

    -

    [Int8] blob

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the Double value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnDouble(position position: Int) -> Double
    - -
    -
    -
    -

    Return Value

    -

    Double value for column

    - -
    -
    -
    -
  • -
  • -
    - - - - columnInt(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the Int value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnInt(position position: Int) -> Int
    - -
    -
    -
    -

    Return Value

    -

    Int value for column

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the Int32 value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnInt32(position position: Int) -> Int32
    - -
    -
    -
    -

    Return Value

    -

    Int32 value for column

    - -
    -
    -
    -
  • -
  • - -
    -
    -
    -
    -
    -

    Returns the Int64 value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnInt64(position position: Int) -> Int64
    - -
    -
    -
    -

    Return Value

    -

    Int64 value for column

    - -
    -
    -
    -
  • -
  • -
    - - - - columnText(position:) - -
    -
    -
    -
    -
    -
    -

    Returns the String value for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnText(position position: Int) -> String
    - -
    -
    -
    -

    Return Value

    -

    String value for column

    - -
    -
    -
    -
  • -
  • -
    - - - - columnType(_:) - -
    -
    -
    -
    -
    -
    -

    Returns the type for the indicated column.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public func columnType(position: Int) -> Int32
    - -
    -
    -
    -

    Return Value

    -

    Int32

    - -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums.html deleted file mode 100644 index 5c7058b..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - Enums Reference - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

Enums

-

The following enums are available globally.

- -
-
-
-
    -
  • -
    - - - - SQLiteError - -
    -
    -
    -
    -
    -
    -

    This enum type indicates an exception when dealing with a SQLite database

    - - See more -
    -
    -

    Declaration

    -
    -

    Swift

    -
    public enum SQLiteError : ErrorProtocol
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums/SQLiteError.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums/SQLiteError.html deleted file mode 100644 index d56dced..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/Enums/SQLiteError.html +++ /dev/null @@ -1,106 +0,0 @@ - - - - SQLiteError Enum Reference - - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
-

SQLiteError

-
-
-
public enum SQLiteError : ErrorProtocol
- -
-
-

This enum type indicates an exception when dealing with a SQLite database

- -
-
-
-
    -
  • -
    - - - - Error - -
    -
    -
    -
    -
    -
    -

    A SQLite error code and message.

    - -
    -
    -

    Declaration

    -
    -

    Swift

    -
    case Error(code: Int, msg: String)
    - -
    -
    -
    -
    -
  • -
-
-
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css deleted file mode 100644 index d0db0e1..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css +++ /dev/null @@ -1,200 +0,0 @@ -/* Credit to https://gist.github.com/wataru420/2048287 */ -.highlight { - /* Comment */ - /* Error */ - /* Keyword */ - /* Operator */ - /* Comment.Multiline */ - /* Comment.Preproc */ - /* Comment.Single */ - /* Comment.Special */ - /* Generic.Deleted */ - /* Generic.Deleted.Specific */ - /* Generic.Emph */ - /* Generic.Error */ - /* Generic.Heading */ - /* Generic.Inserted */ - /* Generic.Inserted.Specific */ - /* Generic.Output */ - /* Generic.Prompt */ - /* Generic.Strong */ - /* Generic.Subheading */ - /* Generic.Traceback */ - /* Keyword.Constant */ - /* Keyword.Declaration */ - /* Keyword.Pseudo */ - /* Keyword.Reserved */ - /* Keyword.Type */ - /* Literal.Number */ - /* Literal.String */ - /* Name.Attribute */ - /* Name.Builtin */ - /* Name.Class */ - /* Name.Constant */ - /* Name.Entity */ - /* Name.Exception */ - /* Name.Function */ - /* Name.Namespace */ - /* Name.Tag */ - /* Name.Variable */ - /* Operator.Word */ - /* Text.Whitespace */ - /* Literal.Number.Float */ - /* Literal.Number.Hex */ - /* Literal.Number.Integer */ - /* Literal.Number.Oct */ - /* Literal.String.Backtick */ - /* Literal.String.Char */ - /* Literal.String.Doc */ - /* Literal.String.Double */ - /* Literal.String.Escape */ - /* Literal.String.Heredoc */ - /* Literal.String.Interpol */ - /* Literal.String.Other */ - /* Literal.String.Regex */ - /* Literal.String.Single */ - /* Literal.String.Symbol */ - /* Name.Builtin.Pseudo */ - /* Name.Variable.Class */ - /* Name.Variable.Global */ - /* Name.Variable.Instance */ - /* Literal.Number.Integer.Long */ } - .highlight .c { - color: #999988; - font-style: italic; } - .highlight .err { - color: #a61717; - background-color: #e3d2d2; } - .highlight .k { - color: #000000; - font-weight: bold; } - .highlight .o { - color: #000000; - font-weight: bold; } - .highlight .cm { - color: #999988; - font-style: italic; } - .highlight .cp { - color: #999999; - font-weight: bold; } - .highlight .c1 { - color: #999988; - font-style: italic; } - .highlight .cs { - color: #999999; - font-weight: bold; - font-style: italic; } - .highlight .gd { - color: #000000; - background-color: #ffdddd; } - .highlight .gd .x { - color: #000000; - background-color: #ffaaaa; } - .highlight .ge { - color: #000000; - font-style: italic; } - .highlight .gr { - color: #aa0000; } - .highlight .gh { - color: #999999; } - .highlight .gi { - color: #000000; - background-color: #ddffdd; } - .highlight .gi .x { - color: #000000; - background-color: #aaffaa; } - .highlight .go { - color: #888888; } - .highlight .gp { - color: #555555; } - .highlight .gs { - font-weight: bold; } - .highlight .gu { - color: #aaaaaa; } - .highlight .gt { - color: #aa0000; } - .highlight .kc { - color: #000000; - font-weight: bold; } - .highlight .kd { - color: #000000; - font-weight: bold; } - .highlight .kp { - color: #000000; - font-weight: bold; } - .highlight .kr { - color: #000000; - font-weight: bold; } - .highlight .kt { - color: #445588; } - .highlight .m { - color: #009999; } - .highlight .s { - color: #d14; } - .highlight .na { - color: #008080; } - .highlight .nb { - color: #0086B3; } - .highlight .nc { - color: #445588; - font-weight: bold; } - .highlight .no { - color: #008080; } - .highlight .ni { - color: #800080; } - .highlight .ne { - color: #990000; - font-weight: bold; } - .highlight .nf { - color: #990000; } - .highlight .nn { - color: #555555; } - .highlight .nt { - color: #000080; } - .highlight .nv { - color: #008080; } - .highlight .ow { - color: #000000; - font-weight: bold; } - .highlight .w { - color: #bbbbbb; } - .highlight .mf { - color: #009999; } - .highlight .mh { - color: #009999; } - .highlight .mi { - color: #009999; } - .highlight .mo { - color: #009999; } - .highlight .sb { - color: #d14; } - .highlight .sc { - color: #d14; } - .highlight .sd { - color: #d14; } - .highlight .s2 { - color: #d14; } - .highlight .se { - color: #d14; } - .highlight .sh { - color: #d14; } - .highlight .si { - color: #d14; } - .highlight .sx { - color: #d14; } - .highlight .sr { - color: #009926; } - .highlight .s1 { - color: #d14; } - .highlight .ss { - color: #990073; } - .highlight .bp { - color: #999999; } - .highlight .vc { - color: #008080; } - .highlight .vg { - color: #008080; } - .highlight .vi { - color: #008080; } - .highlight .il { - color: #009999; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css deleted file mode 100644 index d6d65b7..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css +++ /dev/null @@ -1,332 +0,0 @@ -html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { - background: transparent; - border: 0; - margin: 0; - outline: 0; - padding: 0; - vertical-align: baseline; } - -body { - background-color: #f2f2f2; - font-family: Helvetica, freesans, Arial, sans-serif; - font-size: 14px; - -webkit-font-smoothing: subpixel-antialiased; - word-wrap: break-word; } - -h1, h2, h3 { - margin-top: 0.8em; - margin-bottom: 0.3em; - font-weight: 100; - color: black; } - -h1 { - font-size: 2.5em; } - -h2 { - font-size: 2em; - border-bottom: 1px solid #e2e2e2; } - -h4 { - font-size: 13px; - line-height: 1.5; - margin-top: 21px; } - -h5 { - font-size: 1.1em; } - -h6 { - font-size: 1.1em; - color: #777; } - -.section-name { - color: gray; - display: block; - font-family: Helvetica; - font-size: 22px; - font-weight: 100; - margin-bottom: 15px; } - -pre, code { - font: 0.95em Menlo, monospace; - color: #777; - word-wrap: normal; } - -p code, li code { - background-color: #eee; - padding: 2px 4px; - border-radius: 4px; } - -a { - color: #0088cc; - text-decoration: none; } - -ul { - padding-left: 15px; } - -li { - line-height: 1.8em; } - -img { - max-width: 100%; } - -blockquote { - margin-left: 0; - padding: 0 10px; - border-left: 4px solid #ccc; } - -.content-wrapper { - margin: 0 auto; - width: 980px; } - -header { - font-size: 0.85em; - line-height: 26px; - background-color: #414141; - position: fixed; - width: 100%; - z-index: 1; } - header img { - padding-right: 6px; - vertical-align: -4px; - height: 16px; } - header a { - color: #fff; } - header p { - float: left; - color: #999; } - header .header-right { - float: right; - margin-left: 16px; } - -#breadcrumbs { - background-color: #f2f2f2; - height: 27px; - padding-top: 17px; - position: fixed; - width: 100%; - z-index: 1; - margin-top: 26px; } - #breadcrumbs #carat { - height: 10px; - margin: 0 5px; } - -.sidebar { - background-color: #f9f9f9; - border: 1px solid #e2e2e2; - overflow-y: auto; - overflow-x: hidden; - position: fixed; - top: 70px; - bottom: 0; - width: 230px; - word-wrap: normal; } - -.nav-groups { - list-style-type: none; - background: #fff; - padding-left: 0; } - -.nav-group-name { - border-bottom: 1px solid #e2e2e2; - font-size: 1.1em; - font-weight: 100; - padding: 15px 0 15px 20px; } - .nav-group-name > a { - color: #333; } - -.nav-group-tasks { - margin-top: 5px; } - -.nav-group-task { - font-size: 0.9em; - list-style-type: none; - white-space: nowrap; } - .nav-group-task a { - color: #888; } - -.main-content { - background-color: #fff; - border: 1px solid #e2e2e2; - margin-left: 246px; - position: absolute; - overflow: hidden; - padding-bottom: 60px; - top: 70px; - width: 734px; } - .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { - margin-bottom: 1em; } - .main-content p { - line-height: 1.8em; } - .main-content section .section:first-child { - margin-top: 0; - padding-top: 0; } - .main-content section .task-group-section .task-group:first-of-type { - padding-top: 10px; } - .main-content section .task-group-section .task-group:first-of-type .section-name { - padding-top: 15px; } - -.section { - padding: 0 25px; } - -.highlight { - background-color: #eee; - padding: 10px 12px; - border: 1px solid #e2e2e2; - border-radius: 4px; - overflow-x: auto; } - -.declaration .highlight { - overflow-x: initial; - padding: 0 40px 40px 0; - margin-bottom: -25px; - background-color: transparent; - border: none; } - -.section-name { - margin: 0; - margin-left: 18px; } - -.task-group-section { - padding-left: 6px; - border-top: 1px solid #e2e2e2; } - -.task-group { - padding-top: 0px; } - -.task-name-container a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - -.item { - padding-top: 8px; - width: 100%; - list-style-type: none; } - .item a[name]:before { - content: ""; - display: block; - padding-top: 70px; - margin: -70px 0 0; } - .item code { - background-color: transparent; - padding: 0; } - .item .token { - padding-left: 3px; - margin-left: 15px; - font-size: 11.9px; } - .item .declaration-note { - font-size: .85em; - color: gray; - font-style: italic; } - -.pointer-container { - border-bottom: 1px solid #e2e2e2; - left: -23px; - padding-bottom: 13px; - position: relative; - width: 110%; } - -.pointer { - background: #f9f9f9; - border-left: 1px solid #e2e2e2; - border-top: 1px solid #e2e2e2; - height: 12px; - left: 21px; - top: -7px; - -webkit-transform: rotate(45deg); - -moz-transform: rotate(45deg); - -o-transform: rotate(45deg); - transform: rotate(45deg); - position: absolute; - width: 12px; } - -.height-container { - display: none; - left: -25px; - padding: 0 25px; - position: relative; - width: 100%; - overflow: hidden; } - .height-container .section { - background: #f9f9f9; - border-bottom: 1px solid #e2e2e2; - left: -25px; - position: relative; - width: 100%; - padding-top: 10px; - padding-bottom: 5px; } - -.aside, .language { - padding: 6px 12px; - margin: 12px 0; - border-left: 5px solid #dddddd; - overflow-y: hidden; } - .aside .aside-title, .language .aside-title { - font-size: 9px; - letter-spacing: 2px; - text-transform: uppercase; - padding-bottom: 0; - margin: 0; - color: #aaa; - -webkit-user-select: none; } - .aside p:last-child, .language p:last-child { - margin-bottom: 0; } - -.language { - border-left: 5px solid #cde9f4; } - .language .aside-title { - color: #4b8afb; } - -.aside-warning { - border-left: 5px solid #ff6666; } - .aside-warning .aside-title { - color: #ff0000; } - -.graybox { - border-collapse: collapse; - width: 100%; } - .graybox p { - margin: 0; - word-break: break-word; - min-width: 50px; } - .graybox td { - border: 1px solid #e2e2e2; - padding: 5px 25px 5px 10px; - vertical-align: middle; } - .graybox tr td:first-of-type { - text-align: right; - padding: 7px; - vertical-align: top; - word-break: normal; - width: 40px; } - -.slightly-smaller { - font-size: 0.9em; } - -#footer { - position: absolute; - bottom: 10px; - margin-left: 25px; } - #footer p { - margin: 0; - color: #aaa; - font-size: 0.8em; } - -html.dash header, html.dash #breadcrumbs, html.dash .sidebar { - display: none; } -html.dash .main-content { - width: 980px; - margin-left: 0; - border: none; - width: 100%; - top: 0; - padding-bottom: 0; } -html.dash .height-container { - display: block; } -html.dash .item .token { - margin-left: 0; } -html.dash .content-wrapper { - width: auto; } -html.dash #footer { - position: static; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png deleted file mode 100755 index 29d2f7f..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png deleted file mode 100755 index 6f694c7..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png deleted file mode 100755 index 628da97..0000000 Binary files a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png and /dev/null differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/index.html b/docs/docsets/.docset/Contents/Resources/Documents/index.html deleted file mode 100644 index 9eeeba7..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/index.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - Reference - - - - - - - - - -
-
-

Docs (100% documented)

-
-
-
- -
-
- -
-
-
- -

Authors

- -
-
- -
-
- - - diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js deleted file mode 100755 index 4ff9455..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js +++ /dev/null @@ -1,40 +0,0 @@ -window.jazzy = {'docset': false} -if (typeof window.dash != 'undefined') { - document.documentElement.className += ' dash' - window.jazzy.docset = true -} -if (navigator.userAgent.match(/xcode/i)) { - document.documentElement.className += ' xcode' - window.jazzy.docset = true -} - -// On doc load, toggle the URL hash discussion if present -$(document).ready(function() { - if (!window.jazzy.docset) { - var linkToHash = $('a[href="' + window.location.hash +'"]'); - linkToHash.trigger("click"); - } -}); - -// On token click, toggle its discussion and animate token.marginLeft -$(".token").click(function(event) { - if (window.jazzy.docset) { - return; - } - var link = $(this); - var animationDuration = 300; - var tokenOffset = "15px"; - var original = link.css('marginLeft') == tokenOffset; - link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); - $content = link.parent().parent().next(); - $content.slideToggle(animationDuration); - - // Keeps the document from jumping to the hash. - var href = $(this).attr('href'); - if (history.pushState) { - history.pushState({}, '', href); - } else { - location.hash = href; - } - event.preventDefault(); -}); diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js deleted file mode 100755 index ab28a24..0000000 --- a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ -!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; -if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("