diff --git a/build.gradle.kts b/build.gradle.kts
index 8a61f81..41d71c1 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,7 +1,7 @@
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 plugins {
-  kotlin("jvm") version "1.5.21"
+  kotlin("jvm") version "1.5.31"
   `maven-publish`
   id("ts-gradle")
 }
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 2f4f2a2..cb4b711 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -7,6 +7,7 @@ include("ts-core:ts-datastruct")
 include("ts-core:ts-pool")
 include("ts-core:ts-hash")
 include("ts-core:ts-log")
+include("ts-core:ts-curry")
 include("ts-core:ts-delegation")
 include("ts-core:ts-delegation:ts-observer")
 include("ts-core:ts-clone")
@@ -24,6 +25,8 @@ include("ts-web")
 include("ts-web:ts-web-netty")
 include("ts-web:ts-web-coroutine")
 include("ts-database")
+include("ts-database:ts-ktorm")
+include("ts-database:ts-mybatisplus")
 include("ts-database:ts-mongodb")
 include("ts-database:ts-mongodb:ts-mongodb-spring")
 include("ts-database:ts-redis")
diff --git a/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt b/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt
index e107826..c36a9be 100644
--- a/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt
+++ b/ts-core/src/main/kotlin/cn/tursom/core/Tools.kt
@@ -618,3 +618,28 @@ fun ByteArray.deflate(): ByteArray {
   }
   return bos.toByteArray()
 }
+
+fun StringBuilder.removeLastChars(count: Int) {
+  setLength(length - count)
+}
+
+inline operator fun <reified T> Array<out T>.plus(other: Array<out T>): Array<T> {
+  val array = arrayOfNulls<T>(size + other.size)
+  System.arraycopy(this, 0, array, 0, size)
+  System.arraycopy(other, 0, array, size, other.size)
+  return array.uncheckedCast()
+}
+
+val <T : Any> KClass<T>.allMemberPropertiesSequence: Sequence<KProperty1<T, *>>
+  get() = sequence {
+    yieldAll(memberProperties)
+    var superClass = superclasses.firstOrNull {
+      !it.java.isInterface
+    }
+    while (superClass != null) {
+      yieldAll(superClass.memberProperties.uncheckedCast<Collection<KProperty1<T, *>>>())
+      superClass = superClass.superclasses.firstOrNull {
+        !it.java.isInterface
+      }
+    }
+  }
diff --git a/ts-core/src/main/kotlin/cn/tursom/core/reference/AutoCloseFreeReference.kt b/ts-core/src/main/kotlin/cn/tursom/core/reference/AutoCloseFreeReference.kt
new file mode 100644
index 0000000..e637f0a
--- /dev/null
+++ b/ts-core/src/main/kotlin/cn/tursom/core/reference/AutoCloseFreeReference.kt
@@ -0,0 +1,22 @@
+package cn.tursom.core.reference
+
+import java.io.Closeable
+
+/**
+ * 通过垃圾回收机制实现的自动关闭
+ * 记得保存StrongReference对象防止Closeable意外关闭
+ */
+class AutoCloseFreeReference(
+  private val closeable: Closeable,
+  r: StrongReference<Closeable>,
+) : FreeReference<StrongReference<Closeable>>(r) {
+  override fun release() {
+    closeable.close()
+  }
+}
+
+fun <T : Closeable> T.registerAutoClose(): StrongReference<T> {
+  val r = StrongReference(this)
+  AutoCloseFreeReference(this, r)
+  return r
+}
diff --git a/ts-core/src/main/kotlin/cn/tursom/core/reference/StrongReference.kt b/ts-core/src/main/kotlin/cn/tursom/core/reference/StrongReference.kt
new file mode 100644
index 0000000..f45648d
--- /dev/null
+++ b/ts-core/src/main/kotlin/cn/tursom/core/reference/StrongReference.kt
@@ -0,0 +1,5 @@
+package cn.tursom.core.reference
+
+open class StrongReference<out T>(
+  val r: T,
+)
diff --git a/ts-core/src/main/kotlin/cn/tursom/core/reflect/Parser.kt b/ts-core/src/main/kotlin/cn/tursom/core/reflect/Parser.kt
index 0f43006..954af01 100644
--- a/ts-core/src/main/kotlin/cn/tursom/core/reflect/Parser.kt
+++ b/ts-core/src/main/kotlin/cn/tursom/core/reflect/Parser.kt
@@ -34,7 +34,7 @@ object Parser {
       clazz.isInstance(yaml) -> yaml.cast()
       clazz.isInheritanceFrom(Enum::class.java) -> try {
         val valueOf = clazz.getDeclaredMethod("valueOf", String::class.java)
-        valueOf.invoke(null, yaml.toString().toUpperCase()).cast<T?>()
+        valueOf.invoke(null, yaml.toString().uppercase(Locale.getDefault())).cast<T?>()
       } catch (e: Exception) {
         null
       }
diff --git a/ts-core/src/main/kotlin/cn/tursom/core/reflect/utils.kt b/ts-core/src/main/kotlin/cn/tursom/core/reflect/utils.kt
index 3e9e81c..7e3c6ad 100644
--- a/ts-core/src/main/kotlin/cn/tursom/core/reflect/utils.kt
+++ b/ts-core/src/main/kotlin/cn/tursom/core/reflect/utils.kt
@@ -6,6 +6,7 @@ import cn.tursom.core.isStatic
 import cn.tursom.core.uncheckedCast
 import java.lang.reflect.Field
 import java.lang.reflect.Method
+import java.util.*
 
 inline fun <reified T : Annotation> Class<*>.getAnnotation(): T? = getAnnotation(T::class.java)
 inline fun <reified T : Annotation> Field.getAnnotation(): T? = getAnnotation(T::class.java)
@@ -40,7 +41,7 @@ fun <T : Enum<out T>> Class<out T>.valueOf(value: String): T? {
     valueOf.invoke(null, value) as T
   } catch (e: Exception) {
     try {
-      valueOf?.invoke(null, value.toUpperCase()) as? T?
+      valueOf?.invoke(null, value.uppercase(Locale.getDefault())) as? T?
     } catch (e: Exception) {
       null
     }
diff --git a/ts-core/ts-coroutine/src/main/kotlin/cn/tursom/core/coroutine/GlobalScope.kt b/ts-core/ts-coroutine/src/main/kotlin/cn/tursom/core/coroutine/GlobalScope.kt
new file mode 100644
index 0000000..5f6d2e5
--- /dev/null
+++ b/ts-core/ts-coroutine/src/main/kotlin/cn/tursom/core/coroutine/GlobalScope.kt
@@ -0,0 +1,10 @@
+package cn.tursom.core.coroutine
+
+import kotlinx.coroutines.CoroutineScope
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
+
+object GlobalScope : CoroutineScope {
+  override val coroutineContext: CoroutineContext
+    get() = EmptyCoroutineContext
+}
\ No newline at end of file
diff --git a/ts-core/ts-curry/build.gradle.kts b/ts-core/ts-curry/build.gradle.kts
new file mode 100644
index 0000000..50cbffc
--- /dev/null
+++ b/ts-core/ts-curry/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+  kotlin("jvm")
+  `maven-publish`
+  id("ts-gradle")
+}
+
+dependencies {
+  implementation(project(":"))
+  implementation(project(":ts-core"))
+  testImplementation(group = "junit", name = "junit", version = "4.13")
+}
+
+
+
+
diff --git a/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/I.kt b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/I.kt
new file mode 100644
index 0000000..2c0b523
--- /dev/null
+++ b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/I.kt
@@ -0,0 +1,259 @@
+package cn.tursom.core.curry
+
+object I {
+    inline operator fun <R> invoke(f: () -> R) = f()
+    inline operator fun <T1, R> invoke(f: (T1) -> R, a1: T1) = f(a1)
+    inline operator fun <T1, T2, R> invoke(f: (T1, T2) -> R, a1: T1, a2: T2) = f(a1, a2)
+    inline operator fun <T1, T2, T3, R> invoke(f: (T1, T2, T3) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    inline operator fun <T1, T2, T3, T4, R> invoke(f: (T1, T2, T3, T4) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    inline operator fun <T1, T2, T3, T4, T5, R> invoke(f: (T1, T2, T3, T4, T5) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    inline operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
+}
+
+object F {
+    inline operator fun <R> invoke(f: () -> R) = f()
+
+    inline operator fun <T1, R> invoke(f: (T1) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, R> invoke(f: (T1, T2) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, R> invoke(f: (T1, T2) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, R> invoke(f: (T1, T2, T3) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, R> invoke(f: (T1, T2, T3) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, R> invoke(f: (T1, T2, T3) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, R> invoke(f: (T1, T2, T3, T4) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, R> invoke(f: (T1, T2, T3, T4) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, R> invoke(f: (T1, T2, T3, T4) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, R> invoke(f: (T1, T2, T3, T4) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, R> invoke(f: (T1, T2, T3, T4, T5) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, R> invoke(f: (T1, T2, T3, T4, T5) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, R> invoke(f: (T1, T2, T3, T4, T5) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, R> invoke(f: (T1, T2, T3, T4, T5) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, R> invoke(f: (T1, T2, T3, T4, T5) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, R> invoke(f: (T1, T2, T3, T4, T5, T6) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R, a1: T1) = f(a1)
+
+    inline operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = f(a1, a2, a3, a4, a5, a6, a7, a8, a9)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = f(a1, a2, a3, a4, a5, a6, a7, a8)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = f(a1, a2, a3, a4, a5, a6, a7)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = f(a1, a2, a3, a4, a5, a6)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = f(a1, a2, a3, a4, a5)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3, a4: T4) = f(a1, a2, a3, a4)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2, a3: T3) = f(a1, a2, a3)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1, a2: T2) = f(a1, a2)
+    operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> invoke(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R, a1: T1) = f(a1)
+}
\ No newline at end of file
diff --git a/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/VarargCurrying.kt b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/VarargCurrying.kt
new file mode 100644
index 0000000..635bed7
--- /dev/null
+++ b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/VarargCurrying.kt
@@ -0,0 +1,143 @@
+@file:Suppress("unused")
+
+package cn.tursom.core.curry
+
+import cn.tursom.core.allMethods
+import cn.tursom.core.plus
+import cn.tursom.core.uncheckedCast
+
+
+class VarargCurrying<A, R>(
+    private val func: (Array<out A>) -> R,
+    private val args: Array<out Any?>,
+    private val componentType: Class<A>
+) {
+    companion object {
+        inline operator fun <reified A, R> invoke(noinline func: (Array<out A>) -> R) =
+            VarargCurrying(func, A::class.java)
+
+        inline operator fun <reified A, R> invoke(noinline func: (Array<out A>) -> R, args: Array<out Any?>) =
+            VarargCurrying(func, args, A::class.java)
+    }
+
+    constructor(
+        func: (Array<out A>) -> R,
+        componentType: Class<A> = func.javaClass.allMethods.find {
+            it.name == "invoke" &&
+              it.parameterTypes.size == 1 &&
+              it.parameterTypes[0].isArray
+        }!!.parameters[0].type.componentType.uncheckedCast()
+    ) : this(func, emptyArray(), componentType)
+
+    operator fun invoke(): R = if (componentType == Any::class.java) {
+        func(args.uncheckedCast())
+    } else {
+        val componentArgs = java.lang.reflect.Array.newInstance(componentType, args.size)
+        System.arraycopy(args, 0, componentArgs, 0, args.size)
+        func(componentArgs.uncheckedCast())
+    }
+
+    operator fun invoke(vararg args: A) = VarargCurrying(func, this.args + args, componentType)
+}
+
+class BooleanVarargCurrying<R>(
+    private val func: (BooleanArray) -> R,
+    private val args: BooleanArray
+) {
+    constructor(func: (BooleanArray) -> R) : this(func, booleanArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Boolean) = BooleanVarargCurrying(func, this.args + args)
+}
+
+class CharVarargCurrying<R>(
+    private val func: (CharArray) -> R,
+    private val args: CharArray
+) {
+    constructor(func: (CharArray) -> R) : this(func, charArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Char) = CharVarargCurrying(func, this.args + args)
+}
+
+class ByteVarargCurrying<R>(
+    private val func: (ByteArray) -> R,
+    private val args: ByteArray
+) {
+    constructor(func: (ByteArray) -> R) : this(func, byteArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Byte) = ByteVarargCurrying(func, this.args + args)
+}
+
+class ShortVarargCurrying<R>(
+    private val func: (ShortArray) -> R,
+    private val args: ShortArray
+) {
+    constructor(func: (ShortArray) -> R) : this(func, shortArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Short) = ShortVarargCurrying(func, this.args + args)
+}
+
+class IntVarargCurrying<R>(
+    private val func: (IntArray) -> R,
+    private val args: IntArray
+) {
+    constructor(func: (IntArray) -> R) : this(func, intArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Int) = IntVarargCurrying(func, this.args + args)
+}
+
+class LongVarargCurrying<R>(
+    private val func: (LongArray) -> R,
+    private val args: LongArray
+) {
+    constructor(func: (LongArray) -> R) : this(func, longArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Long) = LongVarargCurrying(func, this.args + args)
+}
+
+class FloatVarargCurrying<R>(
+    private val func: (FloatArray) -> R,
+    private val args: FloatArray
+) {
+    constructor(func: (FloatArray) -> R) : this(func, floatArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Float) = FloatVarargCurrying(func, this.args + args)
+}
+
+class DoubleVarargCurrying<R>(
+    private val func: (DoubleArray) -> R,
+    private val args: DoubleArray
+) {
+    constructor(func: (DoubleArray) -> R) : this(func, doubleArrayOf())
+
+    operator fun invoke() = func(args)
+    operator fun invoke(vararg args: Double) = DoubleVarargCurrying(func, this.args + args)
+}
+
+inline fun <reified T, R> ((Array<out T>) -> R).currying() = VarargCurrying(this)
+fun <R> ((BooleanArray) -> R).currying() = BooleanVarargCurrying(this)
+fun <R> ((CharArray) -> R).currying() = CharVarargCurrying(this)
+fun <R> ((ByteArray) -> R).currying() = ByteVarargCurrying(this)
+fun <R> ((ShortArray) -> R).currying() = ShortVarargCurrying(this)
+fun <R> ((IntArray) -> R).currying() = IntVarargCurrying(this)
+fun <R> ((LongArray) -> R).currying() = LongVarargCurrying(this)
+fun <R> ((FloatArray) -> R).currying() = FloatVarargCurrying(this)
+fun <R> ((DoubleArray) -> R).currying() = DoubleVarargCurrying(this)
+
+inline fun <reified T, R> ((Array<out T>) -> R).currying(vararg args: T) = VarargCurrying(this, args)
+fun <R> ((BooleanArray) -> R).currying(vararg args: Boolean) = BooleanVarargCurrying(this, args)
+fun <R> ((CharArray) -> R).currying(vararg args: Char) = CharVarargCurrying(this, args)
+fun <R> ((ByteArray) -> R).currying(vararg args: Byte) = ByteVarargCurrying(this, args)
+fun <R> ((ShortArray) -> R).currying(vararg args: Short) = ShortVarargCurrying(this, args)
+fun <R> ((IntArray) -> R).currying(vararg args: Int) = IntVarargCurrying(this, args)
+fun <R> ((LongArray) -> R).currying(vararg args: Long) = LongVarargCurrying(this, args)
+fun <R> ((FloatArray) -> R).currying(vararg args: Float) = FloatVarargCurrying(this, args)
+fun <R> ((DoubleArray) -> R).currying(vararg args: Double) = DoubleVarargCurrying(this, args)
+
+
diff --git a/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/currying.kt b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/currying.kt
new file mode 100644
index 0000000..a5f0b5c
--- /dev/null
+++ b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/currying.kt
@@ -0,0 +1,230 @@
+package cn.tursom.core.curry
+
+operator fun <T1, T2, R> ((T1, T2) -> R).invoke() = this
+operator fun <T1, T2, R> ((T1, T2) -> R).invoke(a1: T1) = { a2: T2 -> this(a1, a2) }
+
+operator fun <T1, T2, T3, R> ((T1, T2, T3) -> R).invoke() = this
+operator fun <T1, T2, T3, R> ((T1, T2, T3) -> R).invoke(a1: T1) = { a2: T2, a3: T3 -> this(a1, a2, a3) }
+operator fun <T1, T2, T3, R> ((T1, T2, T3) -> R).invoke(a1: T1, a2: T2) = { a3: T3 -> this(a1, a2, a3) }
+
+operator fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4 -> this(a1, a2, a3, a4) }
+operator fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4 -> this(a1, a2, a3, a4) }
+operator fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4 -> this(a1, a2, a3, a4) }
+
+operator fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5 -> this(a1, a2, a3, a4, a5) }
+operator fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5 -> this(a1, a2, a3, a4, a5) }
+operator fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5 -> this(a1, a2, a3, a4, a5) }
+operator fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5 -> this(a1, a2, a3, a4, a5) }
+
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6 -> this(a1, a2, a3, a4, a5, a6) }
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6 -> this(a1, a2, a3, a4, a5, a6) }
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6 -> this(a1, a2, a3, a4, a5, a6) }
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6 -> this(a1, a2, a3, a4, a5, a6) }
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6 -> this(a1, a2, a3, a4, a5, a6) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14, a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = { a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14, a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = { a15: T15, a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = { a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14, a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = { a15: T15, a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = { a16: T16, a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = { a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14, a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = { a15: T15, a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = { a16: T16, a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = { a17: T17, a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = { a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = { a15: T15, a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = { a16: T16, a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = { a17: T17, a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = { a18: T18, a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = { a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) }
+
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke() = this
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1) = { a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2) = { a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3) = { a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = { a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = { a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = { a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = { a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = { a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = { a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = { a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = { a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = { a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = { a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = { a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = { a16: T16, a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = { a17: T17, a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = { a18: T18, a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = { a19: T19, a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) = { a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) }
+
diff --git a/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/curyingMethod.kt b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/curyingMethod.kt
new file mode 100644
index 0000000..34b56eb
--- /dev/null
+++ b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/curyingMethod.kt
@@ -0,0 +1,97 @@
+package cn.tursom.core.curry
+
+fun <T1, T2, R> ((T1, T2) -> R).currying() = { a1: T1 -> { a2: T2 -> this(a1, a2) } }
+fun <T1, T2, T3, R> ((T1, T2, T3) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> this(a1, a2, a3) } } }
+fun <T1, T2, T3, T4, R> ((T1, T2, T3, T4) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> this(a1, a2, a3, a4) } } } }
+fun <T1, T2, T3, T4, T5, R> ((T1, T2, T3, T4, T5) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> this(a1, a2, a3, a4, a5) } } } } }
+fun <T1, T2, T3, T4, T5, T6, R> ((T1, T2, T3, T4, T5, T6) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> this(a1, a2, a3, a4, a5, a6) } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1, T2, T3, T4, T5, T6, T7) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> this(a1, a2, a3, a4, a5, a6, a7) } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1, T2, T3, T4, T5, T6, T7, T8) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> this(a1, a2, a3, a4, a5, a6, a7, a8) } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9) } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) } } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) } } } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) } } } } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) } } } } } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> { a18: T18 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) } } } } } } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> { a18: T18 -> { a19: T19 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) } } } } } } } } } } } } } } } } } } }
+fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).currying() = { a1: T1 -> { a2: T2 -> { a3: T3 -> { a4: T4 -> { a5: T5 -> { a6: T6 -> { a7: T7 -> { a8: T8 -> { a9: T9 -> { a10: T10 -> { a11: T11 -> { a12: T12 -> { a13: T13 -> { a14: T14 -> { a15: T15 -> { a16: T16 -> { a17: T17 -> { a18: T18 -> { a19: T19 -> { a20: T20 -> this(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) } } } } } } } } } } } } } } } } } } } }
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, R> ((Array<out T1>, T2) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, R> ((Array<out T1>, T2, T3) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, R> ((Array<out T1>, T2, T3, T4) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, R> ((Array<out T1>, T2, T3, T4, T5) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, R> ((Array<out T1>, T2, T3, T4, T5, T6) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R>().currying(args = args)
+
+@JvmName("curryingVararg")
+inline fun <reified T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20) -> R).currying(vararg args: T1) =
+    currying<Array<out T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R>().currying(args = args)
diff --git a/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/uncurrying.kt b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/uncurrying.kt
new file mode 100644
index 0000000..54b8fc4
--- /dev/null
+++ b/ts-core/ts-curry/src/main/kotlin/cn/tursom/core/curry/uncurrying.kt
@@ -0,0 +1,21 @@
+package cn.tursom.core.curry
+
+operator fun <T1, T2, R> ((T1) -> (T2) -> R).invoke(a1: T1, a2: T2) = this(a1)(a2)
+operator fun <T1, T2, T3, R> ((T1) -> (T2) -> (T3) -> R).invoke(a1: T1, a2: T2, a3: T3) = this(a1)(a2)(a3)
+operator fun <T1, T2, T3, T4, R> ((T1) -> (T2) -> (T3) -> (T4) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4) = this(a1)(a2)(a3)(a4)
+operator fun <T1, T2, T3, T4, T5, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5) = this(a1)(a2)(a3)(a4)(a5)
+operator fun <T1, T2, T3, T4, T5, T6, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6) = this(a1)(a2)(a3)(a4)(a5)(a6)
+operator fun <T1, T2, T3, T4, T5, T6, T7, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> (T19) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)
+operator fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, R> ((T1) -> (T2) -> (T3) -> (T4) -> (T5) -> (T6) -> (T7) -> (T8) -> (T9) -> (T10) -> (T11) -> (T12) -> (T13) -> (T14) -> (T15) -> (T16) -> (T17) -> (T18) -> (T19) -> (T20) -> R).invoke(a1: T1, a2: T2, a3: T3, a4: T4, a5: T5, a6: T6, a7: T7, a8: T8, a9: T9, a10: T10, a11: T11, a12: T12, a13: T13, a14: T14, a15: T15, a16: T16, a17: T17, a18: T18, a19: T19, a20: T20) = this(a1)(a2)(a3)(a4)(a5)(a6)(a7)(a8)(a9)(a10)(a11)(a12)(a13)(a14)(a15)(a16)(a17)(a18)(a19)(a20)
diff --git a/ts-core/ts-curry/src/test/kotlin/cn/tursom/core/curry/CurryBuilder.kt b/ts-core/ts-curry/src/test/kotlin/cn/tursom/core/curry/CurryBuilder.kt
new file mode 100644
index 0000000..51e9f25
--- /dev/null
+++ b/ts-core/ts-curry/src/test/kotlin/cn/tursom/core/curry/CurryBuilder.kt
@@ -0,0 +1,189 @@
+package cn.tursom.core.curry
+
+import cn.tursom.core.removeLastChars
+import org.junit.Test
+
+class CurryBuilder {
+    @Test
+    fun buildCurryClass() {
+        (3..20).forEach(::buildCurryClass)
+    }
+
+    @Test
+    fun buildInvokeMethod() {
+        (3..20).forEach(::buildInvokeMethod)
+    }
+
+    @Test
+    fun buildMethodInvoker() {
+        (4..20).forEach(::buildMethodInvoker)
+    }
+
+    @Test
+    fun buildObjectI() {
+        println(
+            "package com.ddbes.kotlin.util\n" +
+              "\n" +
+              "import com.ddbes.kotlin.util.curry.*\n"
+        )
+        println(buildObjectI(20, "I", extensionLambda = false, extensionCurry = false))
+        println(buildObjectI(20, "F", extensionLambda = true, extensionCurry = false))
+        //println(buildObjectI(20, "C", extensionLambda = false, extensionCurry = true))
+    }
+
+    fun args(index: Int) = buildString {
+        repeat(index) {
+            append("a${it + 1}, ")
+        }
+        removeLastChars(2)
+    }
+
+    fun args(fromIndex: Int, toIndex: Int) = buildString {
+        (fromIndex..toIndex).forEach {
+            append("a${it}, ")
+        }
+        removeLastChars(2)
+    }
+
+    fun types(index: Int) = buildString {
+        repeat(index) {
+            append("T${it + 1}, ")
+        }
+        removeLastChars(2)
+    }
+
+    fun types(fromIndex: Int, toIndex: Int) = buildString {
+        (fromIndex..toIndex).forEach {
+            append("T${it}, ")
+        }
+        removeLastChars(2)
+    }
+
+    fun argsWithType(index: Int) = buildString {
+        repeat(index) {
+            append("a${it + 1}: T${it + 1}, ")
+        }
+        removeLastChars(2)
+    }
+
+    fun argsWithType(fromIndex: Int, toIndex: Int) = buildString {
+        (fromIndex..toIndex).forEach {
+            append("a$it: T$it, ")
+        }
+        removeLastChars(2)
+    }
+
+    fun buildObjectI(
+        index: Int,
+        objectName: String = "I",
+        extensionLambda: Boolean = true,
+        extensionCurry: Boolean = true,
+    ) = buildString {
+        append("object $objectName {\n")
+        append("    inline operator fun <R> invoke(f: () -> R) = f()\n")
+        if (extensionLambda || extensionCurry) append("\n")
+        (1..index).forEach {
+            append(
+                "    inline operator fun <${types(it)}, R> invoke(f: (${types(it)}) -> R, ${
+                    argsWithType(it)
+                }) = f(${args(it)})\n"
+            )
+            if (extensionCurry) append(
+                "operator fun <${types(it)}, R> invoke(f: Curry${it}<${types(it)}, R>, ${
+                    argsWithType(it)
+                }) = f(${args(it)})\n"
+            )
+            repeat(it - 1) { curry ->
+                if (extensionLambda) append(
+                    "operator fun <${types(it)}, R> invoke(f: (${types(it)}) -> R, ${
+                        argsWithType(it - curry - 1)
+                    }) = f(${args(it - curry - 1)})\n"
+                )
+                if (extensionCurry) append(
+                    "operator fun <${types(it)}, R> invoke(f: Curry${it}<${types(it)}, R>, ${
+                        argsWithType(it - curry - 1)
+                    }) = f(${args(it - curry - 1)})\n"
+                )
+            }
+            if (extensionLambda || extensionCurry) append("\n")
+        }
+        append("}\n")
+    }
+
+    fun buildCurryClass(index: Int) {
+        val args = args(index)
+        val argsWithType = argsWithType(index)
+        val types = types(index)
+        val invokeAction = "action$index($args)"
+        println(buildString {
+            append("open class Curry$index<$types, R>(\n")
+            append("    val action$index: ($argsWithType) -> R,\n")
+            append(") : Curry${index - 1}<${types(index - 1)}, Curry1<T$index, R>>({ ${args(index - 1)} ->\n")
+            append("    Curry1 { a$index ->\n")
+            append("        action$index($args)\n")
+            append("    }\n")
+            append("}) {\n")
+            if (index > 2) (1..index - 2).forEach { overrideInvoke ->
+                append("    override operator fun invoke(${argsWithType(overrideInvoke)}): Curry${index - overrideInvoke}<${
+                    types(overrideInvoke + 1, index)
+                }, R> = Curry${index - overrideInvoke} { ${args(overrideInvoke + 1, index)} ->\n")
+                append("        $invokeAction\n")
+                append("    }\n")
+                append("\n")
+            }
+            append("    open operator fun invoke($argsWithType): R = $invokeAction\n")
+            append("}\n")
+        })
+    }
+
+    fun buildCurryMethod(index: Int) {
+        val args = args(index)
+        val argsWithType = argsWithType(index)
+        val types = types(index)
+
+        println(buildString {
+            append("fun <$types, R> curry(action: ($types) -> R) =\n")
+            append("    Curry$index { $argsWithType ->\n")
+            append("        action($args)\n")
+            append("    }\n")
+        })
+    }
+
+    fun buildInvokeMethod(index: Int) {
+        val args = args(index)
+        val argsWithType = argsWithType(index)
+        val types = types(index)
+
+        println(buildString {
+            append("operator fun <$types, R> ")
+            repeat(index - 1) {
+                append("Curry1<T${it + 1}, ")
+            }
+            append("Curry1<T$index, R>", ">".repeat(index - 1), ".invoke($argsWithType): R {\n")
+            append("    return if (this is Curry$index) {\n")
+            append("        uncheckedCast<Curry$index<$types, R>>()($args)\n")
+            append("    } else {\n")
+            append("        invoke")
+            repeat(index) { an ->
+                append("(a${an + 1})")
+            }
+            append("\n")
+            append("    }\n")
+            append("}\n")
+        })
+    }
+
+    fun buildMethodInvoker(index: Int) {
+        val args = args(index)
+        val types = types(index)
+
+        println("operator fun <$types, R> (($types) -> R).invoke() = this")
+        (1 until index).forEach { argCount ->
+            println(
+                "operator fun <$types, R> (($types) -> R).invoke(${argsWithType(argCount)}) = " +
+                  "{ ${argsWithType(argCount + 1, index)} -> this(${args}) }"
+            )
+        }
+        println()
+    }
+}
diff --git a/ts-database/ts-ktorm/build.gradle.kts b/ts-database/ts-ktorm/build.gradle.kts
new file mode 100644
index 0000000..f2a8022
--- /dev/null
+++ b/ts-database/ts-ktorm/build.gradle.kts
@@ -0,0 +1,22 @@
+plugins {
+  kotlin("jvm")
+  `maven-publish`
+  id("ts-gradle")
+}
+
+dependencies {
+  api(kotlin("stdlib-jdk8"))
+  api(kotlin("reflect"))
+
+  implementation(project(":ts-core"))
+  implementation(project(":ts-core:ts-clone"))
+  implementation(project(":ts-core:ts-log"))
+  api(group = "org.ktorm", name = "ktorm-core", version = "3.4.1")
+  compileOnly(group = "com.google.code.gson", name = "gson", version = "2.8.7")
+
+  testApi(group = "junit", name = "junit", version = "4.13.2")
+}
+
+
+
+
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/AutoTable.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/AutoTable.kt
similarity index 81%
rename from ts-database/src/main/kotlin/cn/tursom/database/AutoTable.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/AutoTable.kt
index 1e5c450..527729b 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/AutoTable.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/AutoTable.kt
@@ -1,10 +1,10 @@
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
 import cn.tursom.core.clone.Property
 import cn.tursom.core.clone.inject
 import cn.tursom.core.clone.instance
 import cn.tursom.core.uncheckedCast
-import com.baomidou.mybatisplus.annotation.TableField
+import cn.tursom.database.ktorm.annotations.KtormTableField
 import org.ktorm.dsl.QueryRowSet
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
@@ -14,6 +14,7 @@ import kotlin.reflect.KProperty
 import kotlin.reflect.KProperty0
 import kotlin.reflect.KProperty1
 import kotlin.reflect.full.memberProperties
+import kotlin.reflect.jvm.isAccessible
 import kotlin.reflect.jvm.javaField
 
 open class AutoTable<T : Any>(
@@ -24,16 +25,18 @@ open class AutoTable<T : Any>(
   schema: String? = null,
   val unsafe: Boolean = true,
 ) : BaseTable<T>(tableName, alias, catalog, schema, entityClass) {
-  private val fieldMap: Map<String, KProperty<*>>
-  private val fieldColumns: MutableMap<KProperty<*>, Column<*>> = HashMap()
+  private val fieldMap: Map<String, KProperty1<T, *>>
+  private val fieldColumns: MutableMap<KProperty1<T, *>, Column<*>> = HashMap()
   private val fieldNameColumnMap: MutableMap<String, Column<*>> = HashMap()
 
+  val fieldColumnsMap: Map<KProperty1<T, *>, Column<*>> by ::fieldColumns
+
   init {
     fieldMap = entityClass.memberProperties.associateBy { it.simpTableField }
     entityClass.memberProperties.forEach {
       val field = it.javaField ?: return@forEach
-      val tableField: TableField? = field.getAnnotation(TableField::class.java)
-      if (tableField?.exist == false) return@forEach
+      it.isAccessible = true
+      if (field.getAnnotation(KtormTableField::class.java)?.exist == false) return@forEach
       //TypeAdapterFactory.register(this, it)
       val column = TypeAdapterFactory.register(this, it) ?: return@forEach
       fieldColumns[it] = column
@@ -50,7 +53,8 @@ open class AutoTable<T : Any>(
     return instance
   }
 
-  operator fun <R : Any> get(property: KProperty1<T, R?>): Column<R> = fieldColumns[property].uncheckedCast()
+  operator fun <R : Any> get(property: KProperty1<in T, R?>): Column<R> =
+    fieldColumns[property.uncheckedCast()].uncheckedCast()
   //operator fun <R : Any> get(property: KProperty1<T, R?>): Column<R> = this[property.simpTableField].cast()
 
   fun <V : Any> field(): FieldProxy<T, V> = fieldProxyInstance.uncheckedCast()
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/JsonType.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/JsonType.kt
similarity index 95%
rename from ts-database/src/main/kotlin/cn/tursom/database/JsonType.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/JsonType.kt
index dcc6548..dc8d16b 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/JsonType.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/JsonType.kt
@@ -1,4 +1,4 @@
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
 import cn.tursom.core.Utils
 import com.google.gson.Gson
diff --git a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/KtormDml.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/KtormDml.kt
new file mode 100644
index 0000000..3f03d8a
--- /dev/null
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/KtormDml.kt
@@ -0,0 +1,63 @@
+package cn.tursom.database.ktorm
+
+import cn.tursom.core.uncheckedCast
+import org.ktorm.database.Database
+import org.ktorm.dsl.*
+import org.ktorm.schema.Column
+import org.ktorm.schema.ColumnDeclaring
+
+inline fun <reified T : Any> Database.update(
+  noinline block: UpdateStatementBuilder.(AutoTable<T>) -> Unit
+): Int {
+  return update(AutoTable[T::class], block)
+}
+
+inline fun <reified T : Any> Database.batchUpdate(
+  noinline block: BatchUpdateStatementBuilder<AutoTable<T>>.() -> Unit
+): IntArray {
+  return batchUpdate(AutoTable[T::class], block)
+}
+
+inline fun <reified T : Any> Database.insert(
+  noinline block: AssignmentsBuilder.(AutoTable<T>) -> Unit
+): Int {
+  return insert(AutoTable[T::class], block)
+}
+
+inline fun <reified T : Any> Database.insert(
+  value: T
+): Int {
+  val table = AutoTable[T::class]
+  return insert(table) {
+    table.fieldColumnsMap.forEach { (property, column) ->
+      val columnValue = property.get(value) ?: return@forEach
+      set(column.uncheckedCast(), columnValue)
+    }
+  }
+}
+
+inline fun <reified T : Any> Database.insertAndGenerateKey(
+  noinline block: AssignmentsBuilder.(AutoTable<T>) -> Unit
+): Any {
+  return insertAndGenerateKey(AutoTable[T::class], block)
+}
+
+inline fun <reified T : Any> Database.batchInsert(
+  noinline block: BatchInsertStatementBuilder<AutoTable<T>>.() -> Unit
+): IntArray {
+  return batchInsert(AutoTable[T::class], block)
+}
+
+inline fun <reified T : Any> Query.insertTo(vararg columns: Column<*>): Int {
+  return insertTo(AutoTable[T::class], columns = columns)
+}
+
+inline fun <reified T : Any> Database.delete(
+  noinline predicate: (AutoTable<T>) -> ColumnDeclaring<Boolean>
+): Int {
+  return delete(AutoTable[T::class], predicate)
+}
+
+inline fun <reified T : Any> Database.deleteAll(): Int {
+  return deleteAll(AutoTable[T::class])
+}
diff --git a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/KtormOperators.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/KtormOperators.kt
new file mode 100644
index 0000000..227e998
--- /dev/null
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/KtormOperators.kt
@@ -0,0 +1,196 @@
+@file:Suppress("unused")
+
+package cn.tursom.database.ktorm
+
+import org.ktorm.dsl.*
+import org.ktorm.expression.*
+import org.ktorm.schema.SqlType
+import kotlin.reflect.KProperty1
+
+inline fun <reified T : Any> KProperty1<T, *>.isNull(): UnaryExpression<Boolean> = sql.isNull()
+inline fun <reified T : Any> KProperty1<T, *>.isNotNull(): UnaryExpression<Boolean> = sql.isNotNull()
+inline operator fun <reified C : Any, T : Number> KProperty1<C, T?>.unaryMinus(): UnaryExpression<T> =
+  sql.unaryMinus()
+
+inline operator fun <reified C : Any, T : Number> KProperty1<C, T?>.unaryPlus(): UnaryExpression<T> =
+  sql.unaryPlus()
+
+inline operator fun <reified T : Any> KProperty1<T, Boolean?>.not(): UnaryExpression<Boolean> = sql.not()
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> KProperty1<C, T?>.plus(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  sql.plus(expr.sql)
+
+inline infix operator fun <reified C : Any, T : Number> KProperty1<C, T?>.plus(value: T): BinaryExpression<T> =
+  sql.plus(value)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> T.plus(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  plus(expr.sql)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> KProperty1<C, T?>.minus(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  sql.minus(expr.sql)
+
+inline infix operator fun <reified C : Any, T : Number> KProperty1<C, T?>.minus(value: T): BinaryExpression<T> =
+  sql.minus(value)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> T.minus(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  minus(expr.sql)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> KProperty1<C, T?>.times(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  sql.times(expr.sql)
+
+inline infix operator fun <reified C : Any, T : Number> KProperty1<C, T?>.times(value: T): BinaryExpression<T> =
+  sql.times(value)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> T.times(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  times(expr.sql)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> KProperty1<C, T?>.div(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  sql.div(expr.sql)
+
+inline infix operator fun <reified C : Any, T : Number> KProperty1<C, T?>.div(value: T): BinaryExpression<T> =
+  sql.div(value)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> T.div(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  div(expr.sql)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> KProperty1<C, T?>.rem(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  sql.rem(expr.sql)
+
+inline infix operator fun <reified C : Any, T : Number> KProperty1<C, T?>.rem(value: T): BinaryExpression<T> =
+  sql.rem(value)
+
+inline infix operator fun <reified C : Any, reified C2 : Any, T : Number> T.rem(expr: KProperty1<C2, T?>): BinaryExpression<T> =
+  rem(expr.sql)
+
+inline infix fun <reified T : Any, reified T2 : Any> KProperty1<T, *>.like(expr: KProperty1<T2, String?>): BinaryExpression<Boolean> =
+  sql.like(expr.sql)
+
+inline infix fun <reified T : Any> KProperty1<T, *>.like(value: String): BinaryExpression<Boolean> =
+  sql.like(value)
+
+inline infix fun <reified T : Any, reified T2 : Any> KProperty1<T, *>.notLike(expr: KProperty1<T2, String?>): BinaryExpression<Boolean> =
+  sql.notLike(expr.sql)
+
+inline infix fun <reified T : Any> KProperty1<T, *>.notLike(value: String): BinaryExpression<Boolean> =
+  sql.notLike(value)
+
+inline infix fun <reified T : Any, reified T2 : Any> KProperty1<T, Boolean?>.and(expr: KProperty1<T2, Boolean?>): BinaryExpression<Boolean> =
+  sql.and(expr.sql)
+
+inline infix fun <reified T : Any> KProperty1<T, Boolean?>.and(value: Boolean): BinaryExpression<Boolean> =
+  sql.and(value)
+
+inline infix fun <reified T : Any> Boolean.and(expr: KProperty1<T, Boolean?>): BinaryExpression<Boolean> =
+  and(expr.sql)
+
+inline infix fun <reified T : Any, reified T2 : Any> KProperty1<T, Boolean?>.or(expr: KProperty1<T2, Boolean?>): BinaryExpression<Boolean> =
+  sql.or(expr.sql)
+
+inline infix fun <reified T : Any> KProperty1<T, Boolean?>.or(value: Boolean): BinaryExpression<Boolean> =
+  sql.or(value)
+
+inline infix fun <reified T : Any> Boolean.or(expr: KProperty1<T, Boolean?>): BinaryExpression<Boolean> =
+  or(expr.sql)
+
+inline infix fun <reified T : Any, reified T2 : Any> KProperty1<T, Boolean?>.xor(expr: KProperty1<T2, Boolean?>): BinaryExpression<Boolean> =
+  sql.xor(expr.sql)
+
+inline infix fun <reified T : Any> KProperty1<T, Boolean?>.xor(value: Boolean): BinaryExpression<Boolean> =
+  sql.xor(value)
+
+inline infix fun <reified T : Any> Boolean.xor(expr: KProperty1<T, Boolean?>): BinaryExpression<Boolean> =
+  xor(expr.sql)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> KProperty1<C, T?>.less(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  sql.less(expr.sql)
+
+inline infix fun <reified C : Any, T : Comparable<T>> KProperty1<C, T?>.less(value: T): BinaryExpression<Boolean> =
+  sql.less(value)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> T.less(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  less(expr.sql)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> KProperty1<C, T?>.lessEq(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  sql.lessEq(expr.sql)
+
+inline infix fun <reified C : Any, T : Comparable<T>> KProperty1<C, T?>.lessEq(value: T): BinaryExpression<Boolean> =
+  sql.lessEq(value)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> T.lessEq(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  lessEq(expr.sql)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> KProperty1<C, T?>.greater(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  sql.greater(expr.sql)
+
+inline infix fun <reified C : Any, T : Comparable<T>> KProperty1<C, T?>.greater(value: T): BinaryExpression<Boolean> =
+  sql.greater(value)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> T.greater(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  greater(expr.sql)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> KProperty1<C, T?>.greaterEq(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  sql.greaterEq(expr.sql)
+
+inline infix fun <reified C : Any, T : Comparable<T>> KProperty1<C, T?>.greaterEq(value: T): BinaryExpression<Boolean> =
+  sql.greaterEq(value)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Comparable<T>> T.greaterEq(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  greaterEq(expr.sql)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Any> KProperty1<C, T?>.eq(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  sql.eq(expr.sql)
+
+inline infix fun <reified C : Any, T : Any> KProperty1<C, T?>.eq(value: T): BinaryExpression<Boolean> =
+  sql.eq(value)
+
+inline infix fun <reified C : Any, reified C2 : Any, T : Any> KProperty1<C, T?>.notEq(expr: KProperty1<C2, T?>): BinaryExpression<Boolean> =
+  sql.notEq(expr.sql)
+
+inline infix fun <reified C : Any, T : Any> KProperty1<C, T?>.notEq(value: T): BinaryExpression<Boolean> =
+  sql.notEq(value)
+
+inline infix fun <reified C : Any, T : Comparable<T>> KProperty1<C, T?>.between(range: ClosedRange<T>): BetweenExpression<T> =
+  sql.between(range)
+
+inline infix fun <reified C : Any, T : Comparable<T>> KProperty1<C, T?>.notBetween(range: ClosedRange<T>): BetweenExpression<T> =
+  sql.notBetween(range)
+
+inline fun <reified C : Any, T : Any> KProperty1<C, T?>.inList(vararg list: T): InListExpression<T> =
+  sql.inList(list = list)
+
+inline infix fun <reified C : Any, T : Any> KProperty1<C, T?>.inList(list: Collection<T>): InListExpression<T> =
+  sql.inList(list)
+
+inline infix fun <reified C : Any, T : Any> KProperty1<C, T?>.inList(query: Query): InListExpression<T> =
+  sql.inList(query)
+
+inline fun <reified C : Any, T : Any> KProperty1<C, T?>.notInList(vararg list: T): InListExpression<T> =
+  sql.notInList(list = list)
+
+inline infix fun <reified C : Any, T : Any> KProperty1<C, T?>.notInList(list: Collection<T>): InListExpression<T> =
+  sql.notInList(list)
+
+inline infix fun <reified C : Any, T : Any> KProperty1<C, T?>.notInList(query: Query): InListExpression<T> =
+  sql.notInList(query)
+
+inline fun <reified C : Any> KProperty1<C, Number?>.toDouble(): CastingExpression<Double> =
+  sql.toDouble()
+
+inline fun <reified C : Any> KProperty1<C, Number?>.toFloat(): CastingExpression<Float> =
+  sql.toFloat()
+
+inline fun <reified C : Any> KProperty1<C, Number?>.toInt(): CastingExpression<Int> =
+  sql.toInt()
+
+inline fun <reified C : Any> KProperty1<C, Number?>.toShort(): CastingExpression<Short> =
+  sql.toShort()
+
+inline fun <reified C : Any> KProperty1<C, Number?>.toLong(): CastingExpression<Long> =
+  sql.toLong()
+
+@JvmName("booleanToInt")
+inline fun <reified C : Any> KProperty1<C, Boolean?>.toInt(): CastingExpression<Int> =
+  sql.toInt()
+
+inline fun <reified C : Any, T : Any> KProperty1<C, *>.cast(sqlType: SqlType<T>): CastingExpression<T> =
+  sql.cast(sqlType)
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/SqlExtension.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/SqlExtension.kt
similarity index 91%
rename from ts-database/src/main/kotlin/cn/tursom/database/SqlExtension.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/SqlExtension.kt
index ad6d363..bef3b96 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/SqlExtension.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/SqlExtension.kt
@@ -1,12 +1,12 @@
 @file:Suppress("unused")
 
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
 import cn.tursom.core.Utils
 import cn.tursom.core.uncheckedCast
 import com.google.gson.Gson
-import org.ktorm.dsl.Query
-import org.ktorm.dsl.QueryRowSet
+import org.ktorm.database.Database
+import org.ktorm.dsl.*
 import org.ktorm.schema.*
 import java.math.BigDecimal
 import java.sql.Date
@@ -20,15 +20,18 @@ import kotlin.reflect.KProperty1
 import kotlin.reflect.jvm.javaField
 import kotlin.reflect.jvm.javaType
 
+inline fun <reified T : Any> Database.from(): QuerySource = from(AutoTable[T::class])
+fun QuerySource.select(): Query = select(sourceTable.columns)
+
 val KProperty<*>.table
   get() = AutoTable[javaField!!.declaringClass].uncheckedCast<AutoTable<Any>>()
 val <T : Any> KProperty<T>.sql
   get() = table[this.uncheckedCast<KProperty1<Any, T>>()]
 
-inline val <reified T : Any> KProperty1<T, *>.table
+inline val <reified T : Any> KProperty1<in T, *>.table
   get() = AutoTable[T::class.java]
 
-inline val <reified T : Any, R : Any> KProperty1<T, R?>.sql
+inline val <reified T : Any, R : Any> KProperty1<in T, R?>.sql
   get() = table[this]
 
 fun <T> Query.getOne(transform: (rowSet: QueryRowSet) -> T): T? = if (rowSet.next()) {
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/TableField.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TableField.kt
similarity index 70%
rename from ts-database/src/main/kotlin/cn/tursom/database/TableField.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TableField.kt
index 6b2add2..f318857 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/TableField.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TableField.kt
@@ -8,11 +8,10 @@
 
 @file:Suppress("unused")
 
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
-import com.baomidou.mybatisplus.annotation.TableField
-import com.baomidou.mybatisplus.annotation.TableName
-import org.apache.ibatis.type.TypeHandler
+import cn.tursom.database.ktorm.annotations.KtormTableField
+import cn.tursom.database.ktorm.annotations.KtormTableName
 import java.lang.reflect.Field
 import java.lang.reflect.Modifier
 import kotlin.reflect.KClass
@@ -36,46 +35,44 @@ interface TableField<T> {
   val properties: Array<out KProperty1<out T, *>>
   val allField: Array<out String>
   val fullNameField: Array<out String>
-  val typeHandlerMap: Map<KProperty1<out T, *>, TypeHandler<Any>>
 
   //operator fun get(field: KProperty<*>): String = fieldMap[field] ?: field.tableField
   operator fun get(field: KProperty1<out T, *>): String = fieldMap[field] ?: field.simpTableField
 }
 
-
-val <T> Iterable<KProperty1<out T, *>>.filterNotExists
+val <T> Iterable<KProperty1<out T, *>>.filterNotExists: List<KProperty1<out T, *>>
   get() = filter {
     it.javaField != null &&
-      it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java) == null &&
+      (it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java)) == null &&
       !Modifier.isTransient(it.javaField?.modifiers ?: Modifier.TRANSIENT) &&
-      it.javaField?.getAnnotation(com.baomidou.mybatisplus.annotation.TableField::class.java)?.exist != false
+      it.javaField?.getAnnotation(KtormTableField::class.java)?.exist != false
   }
 
 @get:JvmName("filterNotExistsPair")
-val <T> Iterable<Pair<KProperty1<T, *>, *>>.filterNotExists
+val <T> Iterable<Pair<KProperty1<T, *>, *>>.filterNotExists: List<Pair<KProperty1<T, *>, *>>
   get() = filter { (it, _) ->
     it.javaField != null &&
-      it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java) == null &&
+      (it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java)) == null &&
       !Modifier.isTransient(it.javaField?.modifiers ?: Modifier.TRANSIENT) &&
-      it.javaField?.getAnnotation(com.baomidou.mybatisplus.annotation.TableField::class.java)?.exist != false
+      it.javaField?.getAnnotation(KtormTableField::class.java)?.exist != false
   }
 
 @get:JvmName("filterNotExistsKProperty")
-val Iterable<KProperty<*>>.filterNotExists
+val Iterable<KProperty<*>>.filterNotExists: List<KProperty<*>>
   get() = filter {
     it.javaField != null &&
-      it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java) == null &&
+      (it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java)) == null &&
       !Modifier.isTransient(it.javaField?.modifiers ?: Modifier.TRANSIENT) &&
-      it.javaField?.getAnnotation(com.baomidou.mybatisplus.annotation.TableField::class.java)?.exist != false
+      it.javaField?.getAnnotation(KtormTableField::class.java)?.exist != false
   }
 
 @get:JvmName("filterNotExistsKPropertyPair")
-val Iterable<Pair<KProperty<*>, *>>.filterNotExists
+val Iterable<Pair<KProperty<*>, *>>.filterNotExists: List<Pair<KProperty<*>, *>>
   get() = filter { (it, _) ->
     it.javaField != null &&
-      it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java) == null &&
+      (it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java)) == null &&
       !Modifier.isTransient(it.javaField?.modifiers ?: Modifier.TRANSIENT) &&
-      it.javaField?.getAnnotation(com.baomidou.mybatisplus.annotation.TableField::class.java)?.exist != false
+      it.javaField?.getAnnotation(KtormTableField::class.java)?.exist != false
   }
 
 val String.sqlName: String
@@ -94,9 +91,9 @@ val String.sqlName: String
     return sb.toString()
   }
 
-val KClass<*>.tableName: String get() = findAnnotation<TableName>()?.value ?: simpleName!!.sqlName
-val Class<*>.tableName: String get() = getAnnotation(TableName::class.java)?.value ?: simpleName.sqlName
-val KProperty<*>.tableFieldName: String? get() = javaField?.getAnnotation(TableField::class.java)?.value
+val KClass<*>.tableName: String get() = findAnnotation<KtormTableName>()?.name ?: simpleName!!.sqlName
+val Class<*>.tableName: String get() = getAnnotation(KtormTableName::class.java)?.name ?: simpleName.sqlName
+val KProperty<*>.tableFieldName: String? get() = javaField?.getAnnotation(KtormTableField::class.java)?.name
 val KProperty<*>.simpTableField: String get() = tableFieldName ?: name.sqlName
 val KProperty<*>.selectionTableField: String
   get() = tableFieldName?.let { if (it.isNotEmpty()) "$it as ${name.sqlName}" else null } ?: name.sqlName
@@ -104,9 +101,9 @@ val KProperty<*>.selectionTableField: String
 inline val <reified T> KProperty1<out T, *>.tableField: String
   get() {
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       companion[this]
     } else {
       selectionTableField
@@ -116,9 +113,9 @@ inline val <reified T> KProperty1<out T, *>.tableField: String
 inline val <reified T : Any> KProperty1<out T, *>.fullTableField: String
   get() {
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       companion.fullFieldMap[this] ?: "${companion.tableName}.${companion[this]}"
     } else {
       "${T::class.tableName}.$selectionTableField"
@@ -133,8 +130,8 @@ val KProperty<*>.fullTableField: String
 
 val Field.tableField: String
   get() {
-    val tableField = getAnnotation(TableField::class.java)
-    return tableField?.value?.let { if (it.isNotEmpty()) "$it as ${name.sqlName}" else null } ?: name.sqlName
+    val tableField = getAnnotation(KtormTableField::class.java)
+    return tableField?.name?.let { if (it.isNotEmpty()) "$it as ${name.sqlName}" else null } ?: name.sqlName
   }
 
 val KProperty<*>.directTableField: String
@@ -143,9 +140,9 @@ val KProperty<*>.directTableField: String
 inline val <reified T> KProperty1<out T, *>.directTableField: String
   get() {
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       companion.simpFieldMap[this] ?: simpTableField
     } else {
       simpTableField
@@ -158,9 +155,9 @@ inline val <reified T> Collection<KProperty1<out T, *>>.directTableField: Array<
     val companion = T::class.companionObjectInstance
     val fieldList = arrayOfNulls<String>(size)
     filterNotExists.forEach {
-      if (companion is cn.tursom.database.TableField<*>) {
+      if (companion is TableField<*>) {
         @Suppress("UNCHECKED_CAST")
-        companion as cn.tursom.database.TableField<T>
+        companion as TableField<T>
         companion.simpFieldMap[it] ?: it.simpTableField
       } else {
         it.simpTableField
@@ -172,17 +169,17 @@ inline val <reified T> Collection<KProperty1<out T, *>>.directTableField: Array<
 
 val Field.directTableField: String
   get() {
-    val tableField = getAnnotation(TableField::class.java)
-    return tableField?.value?.ifEmpty { null } ?: name.sqlName
+    val tableField = getAnnotation(KtormTableField::class.java)
+    return tableField?.name?.ifEmpty { null } ?: name.sqlName
   }
 
 inline val <reified T>  Array<out KProperty1<T, *>>.tableField: Array<out String> get() = asList().tableField
 inline val <reified T>  Collection<KProperty1<T, *>>.tableField: Array<out String>
   get() {
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       filterNotExists.map { companion[it] }
     } else {
       filterNotExists.map { it.simpTableField }
@@ -192,9 +189,9 @@ inline val <reified T>  Collection<KProperty1<T, *>>.tableField: Array<out Strin
 inline val <reified T> Map<out KProperty1<T, *>, *>.tableField: Map<String, *>
   get() {
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       mapKeys { companion.simpFieldMap[it.key] ?: it.key.directTableField }
     } else {
       mapKeys { it.key.directTableField }
@@ -205,9 +202,9 @@ inline val <reified T> Array<out Pair<KProperty1<T, *>, *>>.tableField: Map<Stri
 inline val <reified T> Collection<Pair<KProperty1<T, *>, *>>.tableField: Map<String, *>
   get() {
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       filterNotExists.associate { (companion.simpFieldMap[it.first] ?: it.first.directTableField) to it.second }
     } else {
       filterNotExists.associate { it.first.directTableField to it.second }
@@ -237,9 +234,9 @@ inline val <reified T>  Collection<KProperty1<T, *>>.fullTableField: Array<out S
   get() {
     val tableName = T::class.tableName
     val companion = T::class.companionObjectInstance
-    return if (companion is cn.tursom.database.TableField<*>) {
+    return if (companion is TableField<*>) {
       @Suppress("UNCHECKED_CAST")
-      companion as cn.tursom.database.TableField<T>
+      companion as TableField<T>
       filterNotExists.map { "$tableName.${companion[it]}" }
     } else {
       filterNotExists.map { "$tableName.${it.simpTableField}" }
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/TableFieldImpl.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TableFieldImpl.kt
similarity index 82%
rename from ts-database/src/main/kotlin/cn/tursom/database/TableFieldImpl.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TableFieldImpl.kt
index 691c1e3..1649659 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/TableFieldImpl.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TableFieldImpl.kt
@@ -1,8 +1,8 @@
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
 import cn.tursom.core.uncheckedCast
+import cn.tursom.database.ktorm.annotations.KtormTableField
 import cn.tursom.log.impl.Slf4jImpl
-import org.apache.ibatis.type.TypeHandler
 import java.lang.reflect.Modifier
 import kotlin.reflect.KClass
 import kotlin.reflect.KProperty1
@@ -31,7 +31,6 @@ open class TableFieldImpl<T>(clazz: KClass<*>? = null) : TableField<T> {
   final override val allField: Array<out String>
   final override val fullNameField: Array<out String>
   final override val properties: Array<KProperty1<T, *>>
-  override val typeHandlerMap = HashMap<KProperty1<out T, *>, TypeHandler<Any>>()
 
   init {
     if (clazz == null && this.javaClass == TableFieldImpl::class.java) {
@@ -50,9 +49,9 @@ open class TableFieldImpl<T>(clazz: KClass<*>? = null) : TableField<T> {
       .uncheckedCast<Collection<KProperty1<out T, *>>>()
       .filter {
         it.javaField != null &&
-          it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java) == null &&
+          (it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java)) == null &&
           !Modifier.isTransient(it.javaField?.modifiers ?: Modifier.TRANSIENT) &&
-          it.javaField?.getAnnotation(com.baomidou.mybatisplus.annotation.TableField::class.java)?.exist != false
+          it.javaField?.getAnnotation(KtormTableField::class.java)?.exist != false
       }
       .forEach {
         val simpTableField = it.simpTableField
@@ -60,7 +59,6 @@ open class TableFieldImpl<T>(clazz: KClass<*>? = null) : TableField<T> {
         simpFieldMap[it] = simpTableField
         fieldMap[it] = it.selectionTableField
         fullFieldMap[it] = "$tableName.${it.name.sqlName}"
-        it.findAnnotation<com.baomidou.mybatisplus.annotation.TableField>()?.typeHandler
       }
     properties = fieldMap.keys.toTypedArray().uncheckedCast()
     allField = fieldMap.values.toTypedArray()
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TypeAdapter.kt
similarity index 93%
rename from ts-database/src/main/kotlin/cn/tursom/database/TypeAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TypeAdapter.kt
index 3957dd2..9103e5e 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TypeAdapter.kt
@@ -1,4 +1,4 @@
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapterFactory.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TypeAdapterFactory.kt
similarity index 98%
rename from ts-database/src/main/kotlin/cn/tursom/database/TypeAdapterFactory.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TypeAdapterFactory.kt
index 348abec..42416a2 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/TypeAdapterFactory.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/TypeAdapterFactory.kt
@@ -1,4 +1,4 @@
-package cn.tursom.database
+package cn.tursom.database.ktorm
 
 import cn.tursom.core.getClassByPackage
 import cn.tursom.core.reflect.InstantAllocator
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/annotations/Getter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/Getter.kt
similarity index 86%
rename from ts-database/src/main/kotlin/cn/tursom/database/annotations/Getter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/Getter.kt
index ae1a889..bf2f635 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/annotations/Getter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/Getter.kt
@@ -1,4 +1,4 @@
-package cn.tursom.database.annotations
+package cn.tursom.database.ktorm.annotations
 
 import kotlin.reflect.KClass
 
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/annotations/Json.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/Json.kt
similarity index 71%
rename from ts-database/src/main/kotlin/cn/tursom/database/annotations/Json.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/Json.kt
index 527209b..e0161de 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/annotations/Json.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/Json.kt
@@ -1,4 +1,4 @@
-package cn.tursom.database.annotations
+package cn.tursom.database.ktorm.annotations
 
 @MustBeDocumented
 @Retention(AnnotationRetention.RUNTIME)
diff --git a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/KtormTableField.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/KtormTableField.kt
new file mode 100644
index 0000000..df38004
--- /dev/null
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/KtormTableField.kt
@@ -0,0 +1,9 @@
+package cn.tursom.database.ktorm.annotations
+
+@MustBeDocumented
+@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FIELD, AnnotationTarget.ANNOTATION_CLASS)
+annotation class KtormTableField(
+  val name: String = "",
+  val exist: Boolean = true,
+)
\ No newline at end of file
diff --git a/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/KtormTableName.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/KtormTableName.kt
new file mode 100644
index 0000000..cafa970
--- /dev/null
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/annotations/KtormTableName.kt
@@ -0,0 +1,8 @@
+package cn.tursom.database.ktorm.annotations
+
+@MustBeDocumented
+@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.FIELD, AnnotationTarget.ANNOTATION_CLASS)
+annotation class KtormTableName(
+  val name: String = "",
+)
\ No newline at end of file
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BooleanAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/BooleanAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BooleanAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/BooleanAdapter.kt
index 2f6eed2..b0d741e 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BooleanAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/BooleanAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.boolean
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.boolean
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BytesAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/BytesAdapter.kt
similarity index 78%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BytesAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/BytesAdapter.kt
index 392537c..5144a21 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/BytesAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/BytesAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.bytes
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.bytes
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DateAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/DateAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DateAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/DateAdapter.kt
index 749e331..ff4cb84 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DateAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/DateAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.jdbcDate
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.jdbcDate
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.sql.Date
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DoubleAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/DoubleAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DoubleAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/DoubleAdapter.kt
index 0b7359f..b75ccbb 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/DoubleAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/DoubleAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.double
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.double
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/EnumAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/EnumAdapter.kt
similarity index 84%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/EnumAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/EnumAdapter.kt
index b26f45b..c6098b6 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/EnumAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/EnumAdapter.kt
@@ -1,8 +1,8 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
 import cn.tursom.core.uncheckedCast
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.simpTableField
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.simpTableField
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import org.ktorm.schema.EnumSqlType
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/FloatAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/FloatAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/FloatAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/FloatAdapter.kt
index 4ea9100..100358e 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/FloatAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/FloatAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.float
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.float
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/InstantAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/InstantAdapter.kt
similarity index 78%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/InstantAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/InstantAdapter.kt
index 27f765c..3920395 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/InstantAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/InstantAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.timestamp
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.timestamp
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.Instant
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/IntAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/IntAdapter.kt
index a4010ce..7b94e5c 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/IntAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.int
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.int
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapterAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/IntAdapterAdapter.kt
similarity index 79%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapterAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/IntAdapterAdapter.kt
index 161bb43..717ba6b 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/IntAdapterAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/IntAdapterAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.decimal
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.decimal
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.math.BigDecimal
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/JsonAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/JsonAdapter.kt
similarity index 72%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/JsonAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/JsonAdapter.kt
index cd4c188..0c6b03e 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/JsonAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/JsonAdapter.kt
@@ -1,8 +1,8 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.annotations.Json
-import cn.tursom.database.json
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.annotations.Json
+import cn.tursom.database.ktorm.json
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalDateAdapter.kt
similarity index 79%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalDateAdapter.kt
index 4b83925..9df6bc5 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalDateAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.date
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.date
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.LocalDate
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateTimeAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalDateTimeAdapter.kt
similarity index 80%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateTimeAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalDateTimeAdapter.kt
index 6f26967..676a403 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalDateTimeAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalDateTimeAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.datetime
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.datetime
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.LocalDateTime
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalTimeAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalTimeAdapter.kt
similarity index 79%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalTimeAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalTimeAdapter.kt
index 3913f48..b066304 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LocalTimeAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LocalTimeAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.time
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.time
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.LocalTime
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LongAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LongAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LongAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LongAdapter.kt
index 61a2132..33d9362 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/LongAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/LongAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.long
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.long
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/MonthDayAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/MonthDayAdapter.kt
similarity index 78%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/MonthDayAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/MonthDayAdapter.kt
index 6eff345..cca6809 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/MonthDayAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/MonthDayAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.monthDay
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.monthDay
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.MonthDay
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/StringAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/StringAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/StringAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/StringAdapter.kt
index 751519a..dea9a4e 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/StringAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/StringAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.varchar
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.varchar
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import kotlin.reflect.KProperty1
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimeAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/TimeAdapter.kt
similarity index 77%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimeAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/TimeAdapter.kt
index 28d4245..0c15b4c 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimeAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/TimeAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.jdbcTime
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.jdbcTime
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.sql.Time
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimestampAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/TimestampAdapter.kt
similarity index 78%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimestampAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/TimestampAdapter.kt
index fbcf00e..a2299ff 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/TimestampAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/TimestampAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.jdbcTimestamp
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.jdbcTimestamp
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.sql.Timestamp
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/UUIDAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/UUIDAdapter.kt
similarity index 78%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/UUIDAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/UUIDAdapter.kt
index 26d459a..deb9714 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/UUIDAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/UUIDAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.uuid
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.uuid
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.util.*
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/YearAdapter.kt
similarity index 78%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/YearAdapter.kt
index cc37282..d4031f7 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/YearAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.year
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.year
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.Year
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearMonthAdapter.kt b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/YearMonthAdapter.kt
similarity index 79%
rename from ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearMonthAdapter.kt
rename to ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/YearMonthAdapter.kt
index 34f20ba..f6c9d61 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/typeadapter/YearMonthAdapter.kt
+++ b/ts-database/ts-ktorm/src/main/kotlin/cn/tursom/database/ktorm/typeadapter/YearMonthAdapter.kt
@@ -1,7 +1,7 @@
-package cn.tursom.database.typeadapter
+package cn.tursom.database.ktorm.typeadapter
 
-import cn.tursom.database.TypeAdapter
-import cn.tursom.database.yearMonth
+import cn.tursom.database.ktorm.TypeAdapter
+import cn.tursom.database.ktorm.yearMonth
 import org.ktorm.schema.BaseTable
 import org.ktorm.schema.Column
 import java.time.YearMonth
diff --git a/ts-database/ts-mybatisplus/build.gradle.kts b/ts-database/ts-mybatisplus/build.gradle.kts
new file mode 100644
index 0000000..78df7a5
--- /dev/null
+++ b/ts-database/ts-mybatisplus/build.gradle.kts
@@ -0,0 +1,22 @@
+plugins {
+  kotlin("jvm")
+  `maven-publish`
+  id("ts-gradle")
+}
+
+dependencies {
+  api(kotlin("stdlib-jdk8"))
+  api(kotlin("reflect"))
+
+  implementation(project(":ts-core"))
+  implementation(project(":ts-core:ts-clone"))
+  implementation(project(":ts-core:ts-log"))
+  implementation(group = "com.baomidou", name = "mybatis-plus", version = "3.4.3.2")
+  compileOnly(group = "com.google.code.gson", name = "gson", version = "2.8.7")
+
+  testApi(group = "junit", name = "junit", version = "4.13.2")
+}
+
+
+
+
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceCompare.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceCompare.kt
new file mode 100644
index 0000000..4a26d99
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceCompare.kt
@@ -0,0 +1,134 @@
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.uncheckedCast
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
+import com.baomidou.mybatisplus.core.conditions.Wrapper
+import com.baomidou.mybatisplus.core.conditions.interfaces.Compare
+import java.util.*
+import kotlin.reflect.KProperty
+import kotlin.reflect.KProperty1
+import kotlin.reflect.full.memberProperties
+import kotlin.reflect.jvm.isAccessible
+
+@Suppress("unused")
+@MybatisPlusEnhanceDslMaker
+interface EnhanceCompare<T, out W : AbstractWrapper<T, String, out W>, Children : Wrapper<T>> :
+  EnhanceEntityClassEnhance<T>,
+  RegexAbstractWrapperEnhance<T, W, Children> {
+  val compare: Compare<Children, String> get() = uncheckedCast()
+
+  /**
+   * QueryWrapper<T>().eq(T::fieldName, value)
+   */
+  infix fun KProperty1<T, *>.eq(
+    value: Any,
+  ): Children = compare.eq(getFieldData()!!.name, value)
+
+  infix fun KProperty<*>.eq(
+    value: Any,
+  ): Children = compare.eq(getFieldData()!!.name, value)
+
+  fun eq(
+    column: Pair<KProperty1<T, *>, Any?>,
+  ): Children = compare.eq(column.first.getFieldData()!!.name, column.second)
+
+  fun eq(
+    vararg pair: Pair<KProperty1<T, *>, Any?>,
+  ): Children = compare.eq(pair.asSequence())
+
+  fun eq(
+    pair: Collection<Pair<KProperty1<T, *>, Any>>,
+  ): Children = compare.eq(pair.asSequence())
+
+  fun eq(
+    pair: Sequence<Pair<KProperty<*>, *>>,
+  ): Children = compare.allEq(
+    pair.mapNotNull { (property, value) ->
+      val fieldData = property.getFieldData() ?: return@mapNotNull null
+      fieldData.name to value
+    }.associate {
+      it
+    }
+  )
+
+  fun <Children> Compare<Children, String>.eq(vararg pair: Pair<KProperty<*>, *>): Children = eq(pair.asSequence())
+
+  fun eq(entity: T): Children {
+    val eqs = LinkedList<Pair<KProperty1<T, *>, Any>>()
+    entity!!.javaClass.kotlin.memberProperties.uncheckedCast<Collection<KProperty1<T, *>>>().forEach {
+      it.isAccessible = true
+      eqs.add(it to (it(entity) ?: return@forEach))
+    }
+    return eq(eqs)
+  }
+
+  fun eqMapEntry(
+    pair: Sequence<Map.Entry<KProperty<*>, *>>,
+  ): Children = compare.allEq(
+    pair.mapNotNull { (property, value) ->
+      val fieldData = property.getFieldData() ?: return@mapNotNull null
+      fieldData.name to value
+    }.associate {
+      it
+    }
+  )
+
+  /**
+   * QueryWrapper<T>().allEq(mapOf(
+   *     T::fieldName1 to value1,
+   *     T::fieldName2 to value2,
+   *     ...
+   * ))
+   */
+  fun allEq(map: Map<out KProperty1<T, *>, *>): Children = compare.eq(map.asSequence())
+
+  fun allEq(vararg pair: Pair<KProperty<*>, *>): Children = compare.eq(pair.asSequence())
+
+  fun allFullEq(vararg pair: Pair<KProperty<*>, *>): Children = compare.eq(pair.asSequence())
+
+  infix fun KProperty1<T, *>.ne(
+    value: Any?,
+  ): Children = compare.ne(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.gt(
+    value: Any?,
+  ): Children = compare.gt(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.ge(
+    value: Any?,
+  ): Children = compare.ge(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.lt(
+    value: Any?,
+  ): Children = compare.lt(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.le(
+    value: Any?,
+  ): Children = compare.le(getFieldData()!!.name, value)
+
+  fun KProperty1<T, *>.between(
+    val1: Any?,
+    val2: Any?,
+  ): Children = compare.between(getFieldData()!!.name, val1, val2)
+
+  fun KProperty1<T, *>.notBetween(
+    val1: Any?,
+    val2: Any?,
+  ): Children = compare.notBetween(getFieldData()!!.name, val1, val2)
+
+  infix fun KProperty1<T, *>.like(
+    value: Any?,
+  ): Children = compare.like(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.notLike(
+    value: Any?,
+  ): Children = compare.notLike(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.likeLeft(
+    value: Any?,
+  ): Children = compare.likeLeft(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.likeRight(
+    value: Any?,
+  ): Children = compare.likeRight(getFieldData()!!.name, value)
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceEntityClassEnhance.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceEntityClassEnhance.kt
new file mode 100644
index 0000000..d071a1c
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceEntityClassEnhance.kt
@@ -0,0 +1,6 @@
+package cn.tursom.database.mybatisplus
+
+@MybatisPlusEnhanceDslMaker
+interface EnhanceEntityClassEnhance<T> {
+  val enhanceEntityClass: Class<T>
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceExtension.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceExtension.kt
new file mode 100644
index 0000000..991f134
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceExtension.kt
@@ -0,0 +1,48 @@
+package cn.tursom.database.mybatisplus
+
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
+import com.baomidou.mybatisplus.core.conditions.Wrapper
+
+inline fun <C : EnhanceCompare<T, W, Children>, T, W : AbstractWrapper<T, String, W>, Children : Wrapper<T>> C.compare(
+  compare: EnhanceCompare<T, W, Children>.() -> Unit
+): C {
+  compare()
+  return this
+}
+
+inline fun <C : FuncEnhance<T, Children>, T, Children : Wrapper<T>> C.func(
+  func: FuncEnhance<T, Children>.() -> Unit
+): C {
+  func()
+  return this
+}
+
+inline fun <C : JoinEnhance<Children>, Children> C.join(
+  join: JoinEnhance<Children>.() -> Unit
+): C {
+  join()
+  return this
+}
+
+inline fun <C : EnhanceQuery<T, Children>, T, Children : Wrapper<T>> C.query(
+  query: EnhanceQuery<T, Children>.() -> Unit
+): C {
+  query()
+  return this
+}
+
+inline fun <C : EnhanceUpdate<T, Children>, T, Children : Wrapper<T>> C.update(
+  update: EnhanceUpdate<T, Children>.() -> Unit
+): C {
+  update()
+  return this
+}
+
+inline fun <C : KtEnhanceWrapper<T, W, EnhanceWrapper>,
+  T, W : AbstractWrapper<T, String, out W>, EnhanceWrapper : Wrapper<T>>
+  C.query(
+  query: KtEnhanceWrapper<T, W, EnhanceWrapper>.() -> Unit
+): C {
+  query()
+  return this
+}
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceField.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceField.kt
new file mode 100644
index 0000000..afa89ae
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceField.kt
@@ -0,0 +1,7 @@
+package cn.tursom.database.mybatisplus
+
+@Target(AnnotationTarget.PROPERTY)
+@Retention(AnnotationRetention.RUNTIME)
+annotation class EnhanceField(
+  val field: String,
+)
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceQuery.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceQuery.kt
new file mode 100644
index 0000000..2ad043f
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceQuery.kt
@@ -0,0 +1,46 @@
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.uncheckedCast
+import com.baomidou.mybatisplus.core.conditions.Wrapper
+import com.baomidou.mybatisplus.core.conditions.query.Query
+import kotlin.reflect.KProperty
+import kotlin.reflect.KProperty1
+
+@Suppress("unused")
+@MybatisPlusEnhanceDslMaker
+interface EnhanceQuery<T, out Children : Wrapper<T>> : EnhanceEntityClassEnhance<T> {
+  val query: Query<out Children, T, out Any> get() = uncheckedCast()
+
+  fun select(
+    columns: Collection<String>,
+  ): Children = query.select(enhanceEntityClass) {
+    it.column in columns
+  }
+
+  fun select(
+    columns: Sequence<String>,
+  ): Children = select(columns.toSet())
+
+  /**
+   * QueryWrapper<T>().select(T::fieldName, value)
+   */
+  fun select(
+    vararg columns: KProperty1<T, *>,
+  ): Children = select(columns = columns as Array<out KProperty<*>>)
+
+  fun select(
+    vararg columns: KProperty<*>,
+  ): Children = select(columns.mapNotNull {
+    it.getFieldData()?.field?.name
+  }.toSet())
+
+  fun fullSelect(
+    vararg columns: KProperty<*>,
+  ): Children = selectMethod(uncheckedCast(), columns.mapNotNull {
+    it.getFieldData()?.selectionName
+  }.toTypedArray()).uncheckedCast()
+
+  fun joinSelect(
+    vararg columns: KProperty<*>,
+  ): Children = fullSelect(columns = columns)
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceUpdate.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceUpdate.kt
new file mode 100644
index 0000000..c0be343
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/EnhanceUpdate.kt
@@ -0,0 +1,43 @@
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.allFieldsSequence
+import cn.tursom.core.uncheckedCast
+import com.baomidou.mybatisplus.core.conditions.Wrapper
+import com.baomidou.mybatisplus.core.conditions.update.Update
+import java.sql.SQLException
+import kotlin.reflect.KProperty1
+import kotlin.reflect.jvm.javaField
+
+@MybatisPlusEnhanceDslMaker
+interface EnhanceUpdate<T, out Children : Wrapper<T>> {
+  val update: Update<out Children, String> get() = uncheckedCast()
+
+  infix fun KProperty1<T, *>.set(
+    value: Any?,
+  ): Children {
+    if (getFieldData()?.exist == false) {
+      logger.warn(
+        "cannot get field data for {}, javaField: {}, kPropertyFieldDataMap: {}",
+        this, javaField, kPropertyFieldDataMap[this]
+      )
+      throw SQLException("using non exist field $name")
+    }
+    return update.set(getFieldData()!!.name, value).uncheckedCast()
+  }
+
+  fun set(vararg values: Pair<KProperty1<T, *>, Any?>): Children {
+    values.forEach { (column, value) ->
+      column set value
+    }
+    return uncheckedCast()
+  }
+
+  fun set(value: T?): Children {
+    value ?: return uncheckedCast()
+    value.javaClass.allFieldsSequence.filterNotExists.forEach { field ->
+      field.isAccessible = true
+      update.set(field.getFieldData().name, field.get(value))
+    }
+    return uncheckedCast()
+  }
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/FuncEnhance.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/FuncEnhance.kt
new file mode 100644
index 0000000..8f5fe3c
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/FuncEnhance.kt
@@ -0,0 +1,67 @@
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.uncheckedCast
+import com.baomidou.mybatisplus.core.conditions.Wrapper
+import com.baomidou.mybatisplus.core.conditions.interfaces.Func
+import kotlin.reflect.KProperty1
+
+@Suppress("unused")
+@MybatisPlusEnhanceDslMaker
+interface FuncEnhance<T, out Children : Wrapper<T>> {
+  val func: Func<out Children, String> get() = uncheckedCast()
+
+  fun KProperty1<T, *>.having(
+    vararg value: Any?,
+  ): Children = func.having(getFieldData()!!.name, value)
+
+  fun KProperty1<T, *>.isNull(column: KProperty1<T, *>): Children = func.isNull(column.getFieldData()!!.name)
+
+  fun KProperty1<T, *>.isNotNull(column: KProperty1<T, *>): Children = func.isNotNull(column.getFieldData()!!.name)
+
+  infix fun KProperty1<T, *>.`in`(
+    value: Any?,
+  ): Children = func.`in`(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.`in`(
+    value: Collection<Any?>,
+  ): Children = func.`in`(getFieldData()!!.name, value)
+
+  fun KProperty1<T, *>.`in`(
+    vararg value: Any,
+  ): Children = func.`in`(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.notIn(
+    value: Collection<Any?>,
+  ): Children = func.notIn(getFieldData()!!.name, value)
+
+  fun KProperty1<T, *>.notIn(
+    vararg value: Any,
+  ): Children = func.notIn(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.inSql(
+    value: String?,
+  ): Children = func.inSql(getFieldData()!!.name, value)
+
+  infix fun KProperty1<T, *>.notInSql(
+    value: String?,
+  ): Children = func.notInSql(getFieldData()!!.name, value)
+
+
+  fun groupBy(column: KProperty1<T, *>): Children = func.groupBy(column.getFieldData()!!.name)
+
+  @Suppress("UNCHECKED_CAST")
+  fun groupBy(vararg columns: KProperty1<T, *>): Children =
+    func.groupBy(columns.map { column -> column.getFieldData()!!.name })
+
+  fun orderByAsc(column: KProperty1<T, *>): Children = func.orderByAsc(column.getFieldData()!!.name)
+
+  @Suppress("UNCHECKED_CAST")
+  fun orderByAsc(vararg columns: KProperty1<T, *>): Children =
+    func.orderByAsc(columns.map { column -> column.getFieldData()!!.name })
+
+  fun orderByDesc(column: KProperty1<T, *>): Children = func.orderByDesc(column.getFieldData()!!.name).uncheckedCast()
+
+  @Suppress("UNCHECKED_CAST")
+  fun orderByDesc(vararg columns: KProperty1<T, *>): Children =
+    func.orderByDesc(columns.map { column -> column.getFieldData()!!.name }).uncheckedCast()
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/IServiceEnhance.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/IServiceEnhance.kt
new file mode 100644
index 0000000..4a1b9cf
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/IServiceEnhance.kt
@@ -0,0 +1,75 @@
+package cn.tursom.database.mybatisplus
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
+import com.baomidou.mybatisplus.core.metadata.IPage
+import com.baomidou.mybatisplus.extension.service.IService
+
+
+inline fun <reified T> IService<T>.update(
+    wrapperBuilder: KtEnhanceUpdateWrapper<T>.() -> Unit
+): Boolean {
+    val wrapper = KtEnhanceUpdateWrapper<T>()
+    wrapper.wrapperBuilder()
+    return update(wrapper)
+}
+
+inline fun <reified T> IService<T>.update(
+    queryBuilder: KtEnhanceWrapper<T, UpdateWrapper<T>, KtEnhanceUpdateWrapper<T>>.() -> Unit,
+    updateBuilder: EnhanceUpdate<T, KtEnhanceUpdateWrapper<T>>.() -> Unit
+): Boolean {
+    val wrapper = KtEnhanceUpdateWrapper<T>()
+    wrapper.queryBuilder()
+    wrapper.updateBuilder()
+    return update(wrapper)
+}
+
+inline fun <reified T> IService<T>.remove(
+    wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
+): Boolean {
+    val wrapper = KtEnhanceQueryWrapper<T>()
+    wrapper.wrapperBuilder()
+    return remove(wrapper)
+}
+
+inline fun <reified T> IService<T>.getOne(
+    throwEx: Boolean = true,
+    wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
+): T {
+    val wrapper = KtEnhanceQueryWrapper<T>()
+    wrapper.wrapperBuilder()
+    return getOne(wrapper, throwEx)
+}
+
+inline fun <reified T> IService<T>.count(
+    wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
+): Long {
+    val wrapper = KtEnhanceQueryWrapper<T>()
+    wrapper.wrapperBuilder()
+    return count(wrapper)
+}
+
+inline fun <reified T> IService<T>.list(
+    wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
+): List<T> {
+    val wrapper = KtEnhanceQueryWrapper<T>()
+    wrapper.wrapperBuilder()
+    return list(wrapper)
+}
+
+inline fun <reified T, E : IPage<T>> IService<T>.page(
+    page: E,
+    wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
+): E {
+    val wrapper = KtEnhanceQueryWrapper<T>()
+    wrapper.wrapperBuilder()
+    return page(page, wrapper)
+}
+
+inline fun <reified T, E : IPage<Map<String, Any>>> IService<T>.pageMaps(
+    page: E,
+    wrapperBuilder: KtEnhanceQueryWrapper<T>.() -> Unit
+): E {
+    val wrapper = KtEnhanceQueryWrapper<T>()
+    wrapper.wrapperBuilder()
+    return pageMaps(page, wrapper)
+}
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/JoinEnhance.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/JoinEnhance.kt
new file mode 100644
index 0000000..5bc379a
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/JoinEnhance.kt
@@ -0,0 +1,21 @@
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.uncheckedCast
+import com.baomidou.mybatisplus.core.conditions.interfaces.Join
+
+@MybatisPlusEnhanceDslMaker
+interface JoinEnhance<out Children> {
+  val join: Join<out Children> get() = uncheckedCast()
+
+  /**
+   * QueryWrapper<T>()
+   *     .xx()
+   *     .xxx()
+   *     ...
+   *     .limit1()
+   */
+  fun limit1(): Children = join.last("LIMIT 1").uncheckedCast()
+
+  fun limit(count: Int): Children = join.last("LIMIT $count").uncheckedCast()
+  fun limit(start: Int, count: Int): Children = join.last("LIMIT $start, $count").uncheckedCast()
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceQueryWrapper.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceQueryWrapper.kt
new file mode 100644
index 0000000..df1d263
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceQueryWrapper.kt
@@ -0,0 +1,18 @@
+package cn.tursom.database.mybatisplus
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
+
+class KtEnhanceQueryWrapper<T>(
+  override var enhanceEntityClass: Class<T>
+) : QueryWrapper<T>(),
+  EnhanceQuery<T, KtEnhanceQueryWrapper<T>>,
+  KtEnhanceWrapper<T, QueryWrapper<T>, KtEnhanceQueryWrapper<T>> {
+  init {
+    this.entityClass = enhanceEntityClass
+  }
+
+  companion object {
+    inline operator fun <reified T> invoke() = KtEnhanceQueryWrapper(T::class.java)
+  }
+}
+
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceUpdateWrapper.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceUpdateWrapper.kt
new file mode 100644
index 0000000..a8a7d04
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceUpdateWrapper.kt
@@ -0,0 +1,13 @@
+package cn.tursom.database.mybatisplus
+
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
+
+class KtEnhanceUpdateWrapper<T>(
+  override val enhanceEntityClass: Class<T>,
+) : UpdateWrapper<T>(),
+  EnhanceUpdate<T, KtEnhanceUpdateWrapper<T>>,
+  KtEnhanceWrapper<T, UpdateWrapper<T>, KtEnhanceUpdateWrapper<T>> {
+  companion object {
+    inline operator fun <reified T> invoke() = KtEnhanceUpdateWrapper(T::class.java)
+  }
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceWrapper.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceWrapper.kt
new file mode 100644
index 0000000..5f31f71
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/KtEnhanceWrapper.kt
@@ -0,0 +1,18 @@
+package cn.tursom.database.mybatisplus
+
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
+import com.baomidou.mybatisplus.core.conditions.Wrapper
+import com.baomidou.mybatisplus.core.conditions.interfaces.Compare
+import com.baomidou.mybatisplus.core.conditions.interfaces.Func
+import com.baomidou.mybatisplus.core.conditions.interfaces.Join
+import com.baomidou.mybatisplus.core.conditions.interfaces.Nested
+
+@MybatisPlusEnhanceDslMaker
+interface KtEnhanceWrapper<T, W : AbstractWrapper<T, String, out W>, EnhanceWrapper : Wrapper<T>> :
+  EnhanceCompare<T, W, EnhanceWrapper>,
+  JoinEnhance<EnhanceWrapper>,
+  FuncEnhance<T, EnhanceWrapper>,
+  Compare<W, String>,
+  Nested<W, W>,
+  Join<W>,
+  Func<W, String>
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/MybatisPlusEnhanceDslMaker.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/MybatisPlusEnhanceDslMaker.kt
new file mode 100644
index 0000000..a5d4298
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/MybatisPlusEnhanceDslMaker.kt
@@ -0,0 +1,5 @@
+package cn.tursom.database.mybatisplus
+
+@DslMarker
+@Retention(AnnotationRetention.BINARY)
+annotation class MybatisPlusEnhanceDslMaker
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/RegexAbstractWrapperEnhance.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/RegexAbstractWrapperEnhance.kt
new file mode 100644
index 0000000..4ddd6b8
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/RegexAbstractWrapperEnhance.kt
@@ -0,0 +1,22 @@
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.uncheckedCast
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
+import kotlin.reflect.KProperty1
+
+@MybatisPlusEnhanceDslMaker
+interface RegexAbstractWrapperEnhance<T, out W : AbstractWrapper<T, String, out W>, Children> {
+  val wrapper: W get() = uncheckedCast()
+
+  infix fun String.regex(
+    value: Any
+  ): Children = WrapperEnhance.regex(wrapper, this, value).uncheckedCast()
+
+  infix fun KProperty1<T, *>.regex(
+    value: Any,
+  ): Children = WrapperEnhance.regex(wrapper, getFieldData()!!.name, value).uncheckedCast()
+
+  infix fun KProperty1<T, *>.regex(
+    regex: Regex,
+  ): Children = WrapperEnhance.regex(wrapper, getFieldData()!!.name, regex.toString()).uncheckedCast()
+}
\ No newline at end of file
diff --git a/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/TableField.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/TableField.kt
new file mode 100644
index 0000000..badc063
--- /dev/null
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/TableField.kt
@@ -0,0 +1,151 @@
+/**
+ * SQL 访问增强工具,实现从属性到数据库字段的自动映射
+ * @author 王景阔
+ * 例:
+ * Files::name.tableField
+ * 可获得 Files 的 name 属性对应的字段名。
+ */
+
+@file:Suppress("unused")
+
+package cn.tursom.database.mybatisplus
+
+import cn.tursom.core.*
+import cn.tursom.core.reference.StrongReference
+import cn.tursom.core.reflect.getAnnotation
+import com.baomidou.mybatisplus.annotation.TableField
+import com.baomidou.mybatisplus.annotation.TableName
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper
+import java.lang.reflect.Field
+import java.util.concurrent.ConcurrentHashMap
+import kotlin.reflect.KProperty
+import kotlin.reflect.full.findAnnotation
+import kotlin.reflect.jvm.javaField
+
+data class FieldData(
+    val field: Field,
+    val name: String,
+    val selectionName: String,
+    val tableField: TableField?,
+    val column: String,
+    val exist: Boolean = !field.transient && !field.static && tableField?.exist ?: true,
+)
+
+val String.sqlName: String
+    get() {
+        val sb = StringBuilder()
+        val iterator = iterator()
+        sb.append(iterator.nextChar().lowercaseChar())
+        iterator.forEach {
+            if (it.isUpperCase()) {
+                sb.append('_')
+                sb.append(it.lowercaseChar())
+            } else {
+                sb.append(it)
+            }
+        }
+        return sb.toString()
+    }
+
+val Class<*>.tableName
+    get() = getAnnotation<TableName>()?.value ?: simpleName.sqlName
+
+internal val allSelectionFieldMap = ConcurrentHashMap<Class<*>, Array<out String>>()
+internal val fieldDataMap = ConcurrentHashMap<Field, FieldData>()
+internal val kPropertyFieldDataMap = ConcurrentHashMap<KProperty<*>, StrongReference<FieldData?>>()
+
+val Iterable<Field>.filterNotExists
+    get() = asSequence().filter {
+        it.getFieldData().exist
+    }
+
+@get:JvmName("filterNotExistsField")
+val Sequence<Field>.filterNotExists
+    get() = filter {
+        it.getFieldData().exist
+    }
+
+@get:JvmName("filterNotExistsKProperty")
+val <T : KProperty<*>> Sequence<T>.filterNotExists
+    get() = filter {
+        it.getFieldData()?.exist ?: false
+    }
+
+fun Field.getFieldData(): FieldData = fieldDataMap.getOrPut(this) {
+    val tableField = getAnnotation<TableField>()
+    try {
+        val tableInfo = TableInfoHelper.getTableInfo(declaringClass)
+        tableInfo?.fieldList?.firstOrNull {
+            it.field == this
+        }?.let { tableFieldInfo ->
+            FieldData(
+                field = tableFieldInfo.field,
+                name = "${tableInfo.tableName}.${tableFieldInfo.column}",
+                selectionName = "${tableInfo.tableName}.${tableFieldInfo.column} as ${name.sqlName}",
+                tableField = getAnnotation(),
+                column = tableFieldInfo.column,
+            )
+        } ?: run {
+            if (tableInfo != null) {
+                FieldData(
+                    field = this,
+                    name = "${tableInfo.tableName}.${name.sqlName}",
+                    selectionName = "${tableInfo.tableName}.${name.sqlName}",
+                    tableField = tableField,
+                    column = tableField?.value ?: name.sqlName,
+                )
+            } else null
+        }
+    } catch (e: Throwable) {
+        null
+    } ?: run {
+        val tableName = declaringClass.tableName
+        FieldData(
+            field = this,
+            name = "$tableName.${tableField?.value ?: name.sqlName}",
+            selectionName = if (tableField == null) {
+                "$tableName.${name.sqlName}"
+            } else {
+                "$tableName.${tableField.value} as ${name.sqlName}"
+            },
+            tableField = tableField,
+            column = tableField?.value ?: name.sqlName,
+        )
+    }
+}
+
+fun KProperty<*>.getFieldData(): FieldData? {
+    return kPropertyFieldDataMap.getOrPut(this) {
+        StrongReference(javaField?.getFieldData() ?: run {
+            val owner = owner ?: return@run null
+            val enhanceField = findAnnotation<EnhanceField>() ?: return@run null
+            if (enhanceField.field.isBlank()) {
+                return@run null
+            }
+            owner.kotlin.allMemberPropertiesSequence.firstOrNull {
+                it.name == enhanceField.field
+            }?.getFieldData()
+        })
+    }?.r
+}
+
+fun getAllSelectionFieldArray(clazz: Class<*>): Array<out String> = allSelectionFieldMap.getOrPut(clazz) {
+    clazz.allFieldsSequence.filterNotExists.map {
+        it.getFieldData().column
+    }.toList().toTypedArray()
+}
+
+fun getAllSelectionField(clazz: Class<*>): List<String> = allSelectionFieldMap.getOrPut(clazz) {
+    clazz.allFieldsSequence.filterNotExists.map {
+        it.getFieldData().column
+    }.toList().toTypedArray()
+}.asList()
+
+fun getSelectionField(vararg columns: KProperty<*>): Sequence<String> = getSelectionField(columns.asSequence())
+fun getSelectionField(columns: Iterable<KProperty<*>>): Sequence<String> = getSelectionField(columns.asSequence())
+
+fun getSelectionField(columns: Sequence<KProperty<*>>): Sequence<String> = columns.map {
+    it.getFieldData()
+}.filterNotNull().map {
+    it.column
+}
diff --git a/ts-database/src/main/kotlin/cn/tursom/database/WrapperEnhance.kt b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/WrapperEnhance.kt
similarity index 59%
rename from ts-database/src/main/kotlin/cn/tursom/database/WrapperEnhance.kt
rename to ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/WrapperEnhance.kt
index 85acd66..4f28f28 100644
--- a/ts-database/src/main/kotlin/cn/tursom/database/WrapperEnhance.kt
+++ b/ts-database/ts-mybatisplus/src/main/kotlin/cn/tursom/database/mybatisplus/WrapperEnhance.kt
@@ -3,13 +3,14 @@
  * @author 王景阔
  */
 @file:Suppress("unused")
+@file:OptIn(UncheckedCast::class)
 
-package cn.tursom.database
+package cn.tursom.database.mybatisplus
 
+import cn.tursom.core.UncheckedCast
+import cn.tursom.core.allFieldsSequence
 import cn.tursom.core.uncheckedCast
-import cn.tursom.database.annotations.Getter
 import cn.tursom.log.impl.Slf4jImpl
-import com.baomidou.mybatisplus.annotation.TableField
 import com.baomidou.mybatisplus.core.conditions.AbstractWrapper
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment
 import com.baomidou.mybatisplus.core.conditions.Wrapper
@@ -20,40 +21,53 @@ import com.baomidou.mybatisplus.core.conditions.query.Query
 import com.baomidou.mybatisplus.core.conditions.update.Update
 import com.baomidou.mybatisplus.core.toolkit.Constants
 import java.lang.reflect.Field
-import java.lang.reflect.Modifier
+import java.sql.SQLException
 import java.util.*
 import java.util.concurrent.atomic.AtomicInteger
 import kotlin.reflect.KProperty
 import kotlin.reflect.KProperty1
-import kotlin.reflect.full.findAnnotation
 import kotlin.reflect.full.memberProperties
 import kotlin.reflect.jvm.isAccessible
 import kotlin.reflect.jvm.javaField
-import kotlin.reflect.jvm.javaGetter
 
 val logger = Slf4jImpl.getLogger("cn.tursom.database")
 
-val select: Query<*, *, Any>.(Array<out Any>) -> Any = Query<*, *, Any>::select
+val selectMethod: Query<*, *, Any>.(Array<out Any>) -> Any = Query<*, *, Any>::select
 
 @Suppress("UNCHECKED_CAST")
-fun <T, Children : Wrapper<T>, Q> Query<Children, T, Q>.select(
-  columns: Array<out Q>,
-): Children = (select as Query<Children, T, Q>.(Array<out Q>) -> Children)(columns)
+inline fun <reified T, Children : Wrapper<T>, Q> Query<Children, T, Q>.select(
+  columns: Collection<String>,
+): Children = select(T::class.java) {
+  it.column in columns
+}
+
+@Suppress("UNCHECKED_CAST")
+inline fun <reified T, Children : Wrapper<T>, Q> Query<Children, T, Q>.select(
+  columns: Sequence<String>,
+): Children = select(columns.toSet())
 
 /**
  * QueryWrapper<T>().select(T::fieldName, value)
  */
 inline fun <reified T, Children : Wrapper<T>> Query<Children, T, String>.select(
   vararg columns: KProperty1<T, *>,
-): Children = select(columns.tableField)
+): Children = select(columns = columns as Array<out KProperty<*>>)
 
-fun <T, Children : Wrapper<T>> Query<Children, T, String>.select(
+inline fun <reified T, Children : Wrapper<T>> Query<Children, T, String>.select(
   vararg columns: KProperty<*>,
-): Children = fullSelect(*columns)
+): Children = select(columns.mapNotNull {
+  it.getFieldData()?.field?.name
+}.toSet())
 
-fun <T, Children : Wrapper<T>> Query<Children, T, String>.fullSelect(
+inline fun <reified T, Children : Wrapper<T>> Query<Children, T, String>.fullSelect(
   vararg columns: KProperty<*>,
-): Children = select(columns.fullTableField)
+): Children = selectMethod(uncheckedCast(), columns.mapNotNull {
+  it.getFieldData()?.selectionName
+}.toTypedArray()).uncheckedCast()
+
+inline fun <reified T, Children : Wrapper<T>> Query<Children, T, String>.joinSelect(
+  vararg columns: KProperty<*>,
+): Children = fullSelect(columns = columns)
 
 /**
  * QueryWrapper<T>().eq(T::fieldName, value)
@@ -61,26 +75,37 @@ fun <T, Children : Wrapper<T>> Query<Children, T, String>.fullSelect(
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.eq(
   column: KProperty1<T, *>,
   value: Any,
-): Children = eq(column.directTableField, value)
+): Children = eq(column.getFieldData()!!.name, value)
 
 fun <T, Children : Wrapper<T>> Compare<Children, String>.eq(
   column: KProperty<*>,
   value: Any,
-): Children = eq(column.directTableField, value)
+): Children = eq(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.eq(
   column: Pair<KProperty1<T, *>, Any?>,
-): Children = eq(column.first.directTableField, column.second)
+): Children = eq(column.first.getFieldData()!!.name, column.second)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.eq(
   vararg pair: Pair<KProperty1<T, *>, Any?>,
-): Children = allEq(pair.tableField)
+): Children = eq(pair.asSequence())
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.eq(
   pair: Collection<Pair<KProperty1<T, *>, Any>>,
-): Children = allEq(pair.tableField)
+): Children = eq(pair.asSequence())
 
-fun <Children> Compare<Children, String>.eq(vararg pair: Pair<KProperty<*>, *>): Children = allEq(pair.fullTableField)
+fun <Children> Compare<Children, String>.eq(
+  pair: Sequence<Pair<KProperty<*>, *>>,
+): Children = allEq(
+  pair.mapNotNull { (property, value) ->
+    val fieldData = property.getFieldData() ?: return@mapNotNull null
+    fieldData.name to value
+  }.associate {
+    it
+  }
+)
+
+fun <Children> Compare<Children, String>.eq(vararg pair: Pair<KProperty<*>, *>): Children = eq(pair.asSequence())
 
 inline fun <reified T : Any, Children : Wrapper<T>> Compare<Children, String>.eq(entity: T): Children {
   val eqs = LinkedList<Pair<KProperty1<T, *>, Any>>()
@@ -91,6 +116,18 @@ inline fun <reified T : Any, Children : Wrapper<T>> Compare<Children, String>.eq
   return eq(eqs)
 }
 
+@JvmName("eqMapEntry")
+fun <Children> Compare<Children, String>.eq(
+  pair: Sequence<Map.Entry<KProperty<*>, *>>,
+): Children = allEq(
+  pair.mapNotNull { (property, value) ->
+    val fieldData = property.getFieldData() ?: return@mapNotNull null
+    fieldData.name to value
+  }.associate {
+    it
+  }
+)
+
 /**
  * QueryWrapper<T>().allEq(mapOf(
  *     T::fieldName1 to value1,
@@ -99,144 +136,141 @@ inline fun <reified T : Any, Children : Wrapper<T>> Compare<Children, String>.eq
  * ))
  */
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.allEq(map: Map<out KProperty1<T, *>, *>): Children =
-  allEq(map.tableField)
+  eq(map.asSequence())
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.allEq(vararg pair: Pair<KProperty1<T, *>, *>): Children =
-  allEq(pair.tableField)
+  eq(pair.asSequence())
 
 fun <Children> Compare<Children, String>.allEq(vararg pair: Pair<KProperty<*>, *>): Children =
-  allEq(pair.fullTableField)
+  eq(pair.asSequence())
 
 fun <Children> Compare<Children, String>.allFullEq(vararg pair: Pair<KProperty<*>, *>): Children =
-  allEq(pair.fullTableField)
+  eq(pair.asSequence())
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.ne(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = ne(column.directTableField, value)
+): Children = ne(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.gt(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = gt(column.directTableField, value)
+): Children = gt(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.ge(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = ge(column.directTableField, value)
+): Children = ge(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.lt(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = lt(column.directTableField, value)
+): Children = lt(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.le(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = le(column.directTableField, value)
+): Children = le(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.between(
   column: KProperty1<T, *>,
   val1: Any?,
   val2: Any?,
-): Children = between(column.directTableField, val1, val2)
+): Children = between(column.getFieldData()!!.name, val1, val2)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.notBetween(
   column: KProperty1<T, *>,
   val1: Any?,
   val2: Any?,
-): Children = notBetween(column.directTableField, val1, val2)
+): Children = notBetween(column.getFieldData()!!.name, val1, val2)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.like(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = like(column.directTableField, value)
+): Children = like(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.notLike(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = notLike(column.directTableField, value)
+): Children = notLike(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.likeLeft(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = likeLeft(column.directTableField, value)
+): Children = likeLeft(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Compare<Children, String>.likeRight(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = likeRight(column.directTableField, value)
+): Children = likeRight(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.having(
   column: KProperty1<T, *>,
   vararg value: Any?,
-): Children = having(column.directTableField, value)
+): Children = having(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.isNull(column: KProperty1<T, *>): Children =
-  isNull(column.directTableField)
+  isNull(column.getFieldData()!!.name)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.isNotNull(column: KProperty1<T, *>): Children =
-  isNotNull(column.directTableField)
+  isNotNull(column.getFieldData()!!.name)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.`in`(
   column: KProperty1<T, *>,
   value: Any?,
-): Children = `in`(column.directTableField, value)
+): Children = `in`(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.`in`(
   column: KProperty1<T, *>,
   value: Collection<Any?>,
-): Children = `in`(column.directTableField, value)
+): Children = `in`(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.`in`(
   column: KProperty1<T, *>,
   vararg value: Any,
-): Children = `in`(column.directTableField, value)
+): Children = `in`(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.notIn(
   column: KProperty1<T, *>,
   value: Collection<Any?>,
-): Children = notIn(column.directTableField, value)
+): Children = notIn(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.notIn(
   column: KProperty1<T, *>,
   vararg value: Any,
-): Children = notIn(column.directTableField, value)
+): Children = notIn(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.inSql(
   column: KProperty1<T, *>,
   value: String?,
-): Children = inSql(column.directTableField, value)
+): Children = inSql(column.getFieldData()!!.name, value)
 
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.notInSql(
   column: KProperty1<T, *>,
   value: String?,
-): Children = notInSql(column.directTableField, value)
+): Children = notInSql(column.getFieldData()!!.name, value)
 
 
-// val groupBy: Func<*, String>.(Array<out String>) -> Any = Func<*, String>::groupBy
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.groupBy(column: KProperty1<T, *>): Children =
-  groupBy(column.directTableField)
+  groupBy(column.getFieldData()!!.name)
 
 @Suppress("UNCHECKED_CAST")
-inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.groupBy(vararg column: KProperty1<T, *>): Children =
-  groupBy(column.directTableField.asList()) as Children
+inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.groupBy(vararg columns: KProperty1<T, *>): Children =
+  groupBy(columns.map { column -> column.getFieldData()!!.name }) as Children
 
-// val orderByAsc: Func<*, String>.(Array<out String>) -> Any = Func<*, String>::orderByAsc
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByAsc(column: KProperty1<T, *>): Children =
-  orderByAsc(column.directTableField)
+  orderByAsc(column.getFieldData()!!.name)
 
 @Suppress("UNCHECKED_CAST")
-inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByAsc(vararg column: KProperty1<T, *>): Children =
-  orderByAsc(column.directTableField.asList()) as Children
+inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByAsc(vararg columns: KProperty1<T, *>): Children =
+  orderByAsc(columns.map { column -> column.getFieldData()!!.name }) as Children
 
-// val orderByDesc: Func<*, String>.(Array<out String>) -> Any = Func<*, String>::orderByDesc
 inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByDesc(column: KProperty1<T, *>): Children =
-  orderByDesc(column.directTableField)
+  orderByDesc(column.getFieldData()!!.name)
 
 @Suppress("UNCHECKED_CAST")
-inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByDesc(vararg column: KProperty1<T, *>): Children =
-  orderByDesc(column.directTableField.asList()) as Children
+inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByDesc(vararg columns: KProperty1<T, *>): Children =
+  orderByDesc(columns.map { column -> column.getFieldData()!!.name }) as Children
 
 
 /**
@@ -248,27 +282,24 @@ inline fun <reified T, Children : Wrapper<T>> Func<Children, String>.orderByDesc
  */
 fun <Children> Join<Children>.limit1(): Children = last("LIMIT 1")
 
-inline fun <reified T, Children : Wrapper<T>> Update<Children, String>.set(
+fun <Children> Join<Children>.limit(count: Int): Children = last("LIMIT $count")
+fun <Children> Join<Children>.limit(start: Int, count: Int): Children = last("LIMIT $start, $count")
+
+fun <T, Children : Wrapper<T>> Update<Children, String>.set(
   column: KProperty1<T, *>,
   value: Any?,
 ): Children {
-  if (column.javaField == null || Modifier.isTransient(column.javaField?.modifiers ?: Modifier.TRANSIENT) ||
-    column.javaField?.getAnnotation(TableField::class.java)?.exist == false
-  ) {
-    return uncheckedCast()
+  if (column.getFieldData()?.exist == false) {
+    logger.warn(
+      "cannot get field data for {}, javaField: {}, kPropertyFieldDataMap: {}",
+      column, column.javaField, kPropertyFieldDataMap[column]
+    )
+    throw SQLException("using non exist field ${column.name}")
   }
-  val getter = column.findAnnotation<Getter>()
-  val v = if (getter == null || !(value != null && getter.getterType.isInstance(value))) {
-    value
-  } else {
-    val getterMethod = column.javaGetter!!.declaringClass.getDeclaredMethod(getter.getter, getter.getterType.java)
-    getterMethod.isAccessible = true
-    getterMethod.invoke(null, value)
-  }
-  return set(column.directTableField, v)
+  return set(column.getFieldData()!!.name, value)
 }
 
-inline fun <reified T, Children : Wrapper<T>> Update<Children, String>.set(vararg values: Pair<KProperty1<T, *>, Any?>): Children {
+fun <T, Children : Wrapper<T>> Update<Children, String>.set(vararg values: Pair<KProperty1<T, *>, Any?>): Children {
   var children: Children? = null
   values.forEach { (column, value) ->
     set(column, value).let {
@@ -278,23 +309,13 @@ inline fun <reified T, Children : Wrapper<T>> Update<Children, String>.set(varar
   return children ?: uncheckedCast()
 }
 
-inline fun <reified T : Any, Children : Wrapper<T>> Update<Children, String>.set(value: T): Children {
-  var children: Children? = null
-  value::class.memberProperties
-    .uncheckedCast<Collection<KProperty1<T, *>>>()
-    .filter {
-      it.javaField != null &&
-          (it.findAnnotation() ?: it.javaField?.getAnnotation(Transient::class.java)) == null &&
-          !Modifier.isTransient(it.javaField?.modifiers ?: Modifier.TRANSIENT) &&
-          it.javaField?.getAnnotation(TableField::class.java)?.exist != false
-    }
-    .forEach { property ->
-      property.isAccessible = true
-      set(property, property.get(value) ?: return@forEach).let {
-        if (children == null) children = it
-      }
-    }
-  return children ?: uncheckedCast()
+fun <Children> Update<Children, String>.set(value: Any?): Children {
+  value ?: return uncheckedCast()
+  value.javaClass.allFieldsSequence.filterNotExists.forEach { field ->
+    field.isAccessible = true
+    set(field.getFieldData().name, field.get(value))
+  }
+  return uncheckedCast()
 }
 
 object Regexp : ISqlSegment {
@@ -310,9 +331,10 @@ object WrapperEnhance : AbstractWrapper<Any, String, WrapperEnhance>() {
     initNeed()
   }
 
-  fun <T, W : AbstractWrapper<T, String, W>> regex(wrapper: W, column: String, value: Any): W {
+  fun <T, W : AbstractWrapper<T, String, out W>> regex(wrapper: W, column: String, value: Any): W {
     wrapper.expression.add(ISqlSegment { columnToString(column) }, Regexp, ISqlSegment {
-      val genParamName = Constants.WRAPPER_PARAM + (paramNameSeqField.get(wrapper) as AtomicInteger).incrementAndGet()
+      val genParamName =
+        Constants.WRAPPER_PARAM + (paramNameSeqField.get(wrapper) as AtomicInteger).incrementAndGet()
       wrapper.paramNameValuePairs[genParamName] = value
       "#{${Constants.WRAPPER}${Constants.WRAPPER_PARAM_MIDDLE}$genParamName}"
     })
@@ -325,8 +347,8 @@ fun <T, W : AbstractWrapper<T, String, W>> W.regex(column: String, value: Any):
 
 inline fun <reified T, W : AbstractWrapper<T, String, W>> W.regex(
   column: KProperty1<T, *>, value: Any,
-): W = WrapperEnhance.regex(this, column.directTableField, value)
+): W = WrapperEnhance.regex(this, column.getFieldData()!!.name, value)
 
 inline fun <reified T, W : AbstractWrapper<T, String, W>> W.regex(
   column: KProperty1<T, *>, regex: Regex,
-): W = WrapperEnhance.regex(this, column.directTableField, regex.toString())
+): W = WrapperEnhance.regex(this, column.getFieldData()!!.name, regex.toString())
diff --git a/ts-web/src/main/kotlin/cn/tursom/web/router/RoutedHttpHandler.kt b/ts-web/src/main/kotlin/cn/tursom/web/router/RoutedHttpHandler.kt
index e5d6fc6..7ed35f2 100644
--- a/ts-web/src/main/kotlin/cn/tursom/web/router/RoutedHttpHandler.kt
+++ b/ts-web/src/main/kotlin/cn/tursom/web/router/RoutedHttpHandler.kt
@@ -1,5 +1,6 @@
 package cn.tursom.web.router
 
+import cn.tursom.core.allMethodsSequence
 import cn.tursom.core.buffer.ByteBuffer
 import cn.tursom.core.json.JsonWorkerImpl
 import cn.tursom.core.lambda
@@ -55,7 +56,9 @@ open class RoutedHttpHandler(
     if ((target.isEmpty())) {
       addRouter(this)
     } else {
-      target.forEach(::addRouter)
+      target.forEach {
+        addRouter(it)
+      }
     }
   }
 
@@ -90,9 +93,8 @@ open class RoutedHttpHandler(
 
   open fun addRouter(handler: Any) {
     log?.info("add router {}", handler)
-    @Suppress("LeakingThis")
-    val clazz = handler.javaClass
-    clazz.methods.forEach { method ->
+    handler.javaClass.allMethodsSequence.forEach { method ->
+      method.isAccessible = true
       method.parameterTypes.let {
         if (!(it.size == 1 && HttpContent::class.java.isAssignableFrom(it[0])) && it.isNotEmpty()) {
           return@forEach
@@ -134,7 +136,7 @@ open class RoutedHttpHandler(
     val mapping = obj::class.java.getAnnotation(Mapping::class.java)?.route ?: arrayOf("")
     method.annotations.forEach { annotation ->
       val (routes, router) = getRoutes(annotation) ?: return@forEach
-      log?.info("mapping {} => {}", routes, method)
+      log?.info("mapping {} {} => {}", getRouteMethod(annotation), routes, method)
       routes.forEach { route ->
         if (mapping.isEmpty()) {
           addRouter(obj, method, route, router)
@@ -211,7 +213,7 @@ open class RoutedHttpHandler(
     method.annotations.forEach { annotation ->
       val (routes, router) = getRoutes(annotation) ?: return@forEach
       routes.forEach { route ->
-        log?.info("delete route {} => {}", route, method)
+        log?.info("delete route {} {} => {}", getRouteMethod(annotation), route, method)
         if (mapping.isEmpty()) {
           deleteMapping(obj, route, router)
         } else mapping.forEach {
@@ -228,8 +230,22 @@ open class RoutedHttpHandler(
     }
   }
 
+  protected fun getRouteMethod(annotation: Annotation): String? = when (annotation) {
+    is Mapping -> annotation.method.ifEmpty { annotation.methodEnum.method }
+    is GetMapping -> "GET"
+    is PostMapping -> "POST"
+    is PutMapping -> "PUT"
+    is DeleteMapping -> "DELETE"
+    is PatchMapping -> "PATCH"
+    is TraceMapping -> "TRACE"
+    is HeadMapping -> "HEAD"
+    is OptionsMapping -> "OPTIONS"
+    is ConnectMapping -> "CONNECT"
+    else -> null
+  }
+
   protected fun getRoutes(annotation: Annotation) = when (annotation) {
-    is Mapping -> annotation.route to getRouter(annotation.method.let { if (it.isEmpty()) annotation.methodEnum.method else it })
+    is Mapping -> annotation.route to getRouter(annotation.method.ifEmpty { annotation.methodEnum.method })
     is GetMapping -> annotation.route to getRouter("GET")
     is PostMapping -> annotation.route to getRouter("POST")
     is PutMapping -> annotation.route to getRouter("PUT")
@@ -245,7 +261,7 @@ open class RoutedHttpHandler(
   protected fun getRouter(method: String): Router<Pair<Any?, (HttpContent) -> Any?>> = when {
     method.isEmpty() -> router
     else -> {
-      val upperCaseMethod = method.toUpperCase()
+      val upperCaseMethod = method.uppercase()
       var router = routerMap[upperCaseMethod]
       if (router == null) {
         router = routerMaker()
diff --git a/ts-web/ts-web-coroutine/build.gradle.kts b/ts-web/ts-web-coroutine/build.gradle.kts
index f7af6c3..1e9512e 100644
--- a/ts-web/ts-web-coroutine/build.gradle.kts
+++ b/ts-web/ts-web-coroutine/build.gradle.kts
@@ -7,6 +7,7 @@ plugins {
 dependencies {
   implementation(project(":"))
   implementation(project(":ts-web"))
+  implementation(project(":ts-core"))
   implementation(project(":ts-core:ts-buffer"))
   implementation(project(":ts-core:ts-json"))
   implementation(group = "org.slf4j", name = "slf4j-api", version = "1.7.32")
diff --git a/ts-web/ts-web-coroutine/src/main/kotlin/cn/tursom/web/router/AsyncRoutedHttpHandler.kt b/ts-web/ts-web-coroutine/src/main/kotlin/cn/tursom/web/router/AsyncRoutedHttpHandler.kt
index e0c1cae..ed8b523 100644
--- a/ts-web/ts-web-coroutine/src/main/kotlin/cn/tursom/web/router/AsyncRoutedHttpHandler.kt
+++ b/ts-web/ts-web-coroutine/src/main/kotlin/cn/tursom/web/router/AsyncRoutedHttpHandler.kt
@@ -1,5 +1,6 @@
 package cn.tursom.web.router
 
+import cn.tursom.core.allMethodsSequence
 import cn.tursom.web.HttpContent
 import cn.tursom.web.MutableHttpContent
 import cn.tursom.web.mapping.*
@@ -11,16 +12,18 @@ import kotlinx.coroutines.launch
 import org.slf4j.LoggerFactory
 import java.io.ByteArrayOutputStream
 import java.io.PrintStream
+import java.util.*
 import kotlin.reflect.KCallable
 import kotlin.reflect.full.findAnnotation
 import kotlin.reflect.jvm.jvmErasure
+import kotlin.reflect.jvm.kotlinFunction
 
 @Suppress("ProtectedInFinal", "unused", "MemberVisibilityCanBePrivate")
 open class AsyncRoutedHttpHandler(
   vararg target: Any,
   routerMaker: () -> Router<Pair<Any?, (HttpContent) -> Any?>> = { SimpleRouter() },
   val asyncRouterMaker: () -> Router<Pair<Any?, suspend (HttpContent) -> Unit>> = { SimpleRouter() }
-) : RoutedHttpHandler(target, routerMaker) {
+) : RoutedHttpHandler(target = target, routerMaker = routerMaker) {
   protected val asyncRouter: Router<Pair<Any?, suspend (HttpContent) -> Unit>> = asyncRouterMaker()
   protected val asyncRouterMap: HashMap<String, Router<Pair<Any?, suspend (HttpContent) -> Unit>>> = HashMap()
 
@@ -82,15 +85,21 @@ open class AsyncRoutedHttpHandler(
 
   override fun addRouter(handler: Any) {
     super.addRouter(handler)
-    handler::class.members.forEach { member ->
-      if (member.isSuspend) {
-        member.parameters.let {
+    handler.javaClass.allMethodsSequence.forEach { method ->
+      val function = try {
+        method.kotlinFunction ?: return@forEach
+      } catch (e: Exception) {
+        return@forEach
+      }
+      method.isAccessible = true
+      if (function.isSuspend) {
+        function.parameters.let {
           if (it.size != 1 && !(it.size == 2 && HttpContent::class.java.isAssignableFrom(it[1].type.jvmErasure.java))) {
             return@forEach
           }
         }
-        log?.trace("mapping {} {}", member, member.parameters)
-        insertMapping(handler, member)
+        log?.trace("mapping {} {}", function, function.parameters)
+        insertMapping(handler, function)
       }
     }
   }
@@ -100,7 +109,7 @@ open class AsyncRoutedHttpHandler(
     method.annotations.forEach { annotation ->
       val (routes, router) = getAsyncRoutes(annotation) ?: return@forEach
       @Suppress("DuplicatedCode")
-      log?.info("mapping {} => {}", routes, method)
+      log?.info("mapping {} {} => {}", getRouteMethod(annotation), routes, method)
       routes.forEach { route ->
         if (mapping.isEmpty()) {
           addRouter(obj, method, route, router)
@@ -174,7 +183,7 @@ open class AsyncRoutedHttpHandler(
   protected fun getAsyncRouter(method: String): Router<Pair<Any?, suspend (HttpContent) -> Unit>> = when {
     method.isEmpty() -> asyncRouter
     else -> {
-      val upperCaseMethod = method.toUpperCase()
+      val upperCaseMethod = method.uppercase(Locale.getDefault())
       var router = asyncRouterMap[upperCaseMethod]
       if (router == null) {
         router = asyncRouterMaker()