Kotlin multiplatform/native interoperability with Objective-C framework

Multi tool use
I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:
Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.
But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:
fromPreset(presets.iosX64, 'ios') {
compilations.main.outputKinds('FRAMEWORK')
compilations.main {
cinterops {
firebase {
def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
includeDirs '${pods}Firebase/CoreOnly/Sources',
'${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
}
}
}
}
Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?
UPD:
here I found an example of usage cinterop
tool like this:
cd samples/gitchurn
../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
-compilerOpts -I/usr/local/include -o libgit2
It looks like cinterop
tool should be in /dist/bin/
folder in my projects but there is no such folder. Where do I get cinterop
tool ?
kotlin kotlin-interop kotlin-native kotlin-multiplatform
add a comment |
I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:
Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.
But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:
fromPreset(presets.iosX64, 'ios') {
compilations.main.outputKinds('FRAMEWORK')
compilations.main {
cinterops {
firebase {
def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
includeDirs '${pods}Firebase/CoreOnly/Sources',
'${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
}
}
}
}
Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?
UPD:
here I found an example of usage cinterop
tool like this:
cd samples/gitchurn
../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
-compilerOpts -I/usr/local/include -o libgit2
It looks like cinterop
tool should be in /dist/bin/
folder in my projects but there is no such folder. Where do I get cinterop
tool ?
kotlin kotlin-interop kotlin-native kotlin-multiplatform
add a comment |
I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:
Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.
But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:
fromPreset(presets.iosX64, 'ios') {
compilations.main.outputKinds('FRAMEWORK')
compilations.main {
cinterops {
firebase {
def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
includeDirs '${pods}Firebase/CoreOnly/Sources',
'${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
}
}
}
}
Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?
UPD:
here I found an example of usage cinterop
tool like this:
cd samples/gitchurn
../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
-compilerOpts -I/usr/local/include -o libgit2
It looks like cinterop
tool should be in /dist/bin/
folder in my projects but there is no such folder. Where do I get cinterop
tool ?
kotlin kotlin-interop kotlin-native kotlin-multiplatform
I'm trying to call Swift/Objective-C code from Kotlin in a multiplatform project. There are no problems with calls to platform code. But when I'm trying to call some library (or framework, not sure how it is properly called as I'm not an iOS dev) it fails. Docs states that it is possible to call Objective-C code and Swift if it is properly exported:
Kotlin/Native provides bidirectional interoperability with Objective-C. Objective-C frameworks and libraries can be used in Kotlin code if properly imported to the build (system frameworks are imported by default). See e.g. "Using cinterop" in Gradle plugin documentation. A Swift library can be used in Kotlin code if its API is exported to Objective-C with @objc. Pure Swift modules are not yet supported.
But it does not say anything about how can I import them properly. It only point to gradle plugin description that describes old version of gradle plugin. So it does not work for me. Finally I figured out something might be the way to import Objective-C code:
fromPreset(presets.iosX64, 'ios') {
compilations.main.outputKinds('FRAMEWORK')
compilations.main {
cinterops {
firebase {
def pods = '${System.getProperty("user.home")}/Projects/kmpp/iosApp/Pods/'
includeDirs '${pods}Firebase/CoreOnly/Sources',
'${pods}FirebaseAnalytics/Frameworks/FirebaseAnalytics.framework/Headers'
}
}
}
}
Build runs without failures, but it does not import anything. What am I doing wrong? Is it possible to import such a lib at all?
UPD:
here I found an example of usage cinterop
tool like this:
cd samples/gitchurn
../../dist/bin/cinterop -def src/main/c_interop/libgit2.def
-compilerOpts -I/usr/local/include -o libgit2
It looks like cinterop
tool should be in /dist/bin/
folder in my projects but there is no such folder. Where do I get cinterop
tool ?
kotlin kotlin-interop kotlin-native kotlin-multiplatform
kotlin kotlin-interop kotlin-native kotlin-multiplatform
edited Jan 17 at 14:42


Mark
5,37433251
5,37433251
asked Jan 2 at 11:24
oleg.semenoleg.semen
1,2751537
1,2751537
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
add a comment |
I ended up with this cinterops
section in build.gradle
fromPreset(presets.iosX64, 'ios') {
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
compilations.main {
outputKinds('FRAMEWORK')
cinterops {
firebase {
defFile "$projectDir/src/iosMain/cinterop/firebase.def"
includeDirs {
allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
"$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
}
compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
}
}
}
}
end this .def
file:
language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h
What's going on here ? Cocopods frameworks are placed in Pods
directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public
folder. and it contains references to other header files it needs... So you specify these files names in your .def
file in headers section.
Next you need to specify where to look for these files and other referenced by them. You can do it in .def
file in includeDirs
or in build.gradle
file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public
folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)
Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts
and linkerOpts
prefixing them with -F
if it is framework or -L
if it is library.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54005467%2fkotlin-multiplatform-native-interoperability-with-objective-c-framework%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
add a comment |
It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
add a comment |
It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?
It looks like you are going to use a cocoapods library. Currently the Gradle plugin has no support for cocapods out of the box. But may be a dependency on your library can be configured "manully". Could you please share a link to your project?
answered Jan 3 at 5:55


Ilya MatveevIlya Matveev
912
912
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
add a comment |
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
yes, that's cocoapods. There is nothing special in my project so I did not push it to github. It is just a default multiplatform project created by IDEA where I added firebase lib as described here: firebase.google.com/docs/ios/setup If gradle plugin does not support cocoapods out of the box is it possible to do it manually ? For example by creating .def file and running cinterop tool ? BTW I've been trying to do this as well and it did not work. My terminal does not recognize cinterop command.
– oleg.semen
Jan 3 at 15:35
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
I guess yes, it can be done manualy but I cannot check it right now. I'll check it when it's possible and answer you.
– Ilya Matveev
Jan 4 at 6:33
add a comment |
I ended up with this cinterops
section in build.gradle
fromPreset(presets.iosX64, 'ios') {
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
compilations.main {
outputKinds('FRAMEWORK')
cinterops {
firebase {
defFile "$projectDir/src/iosMain/cinterop/firebase.def"
includeDirs {
allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
"$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
}
compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
}
}
}
}
end this .def
file:
language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h
What's going on here ? Cocopods frameworks are placed in Pods
directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public
folder. and it contains references to other header files it needs... So you specify these files names in your .def
file in headers section.
Next you need to specify where to look for these files and other referenced by them. You can do it in .def
file in includeDirs
or in build.gradle
file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public
folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)
Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts
and linkerOpts
prefixing them with -F
if it is framework or -L
if it is library.
add a comment |
I ended up with this cinterops
section in build.gradle
fromPreset(presets.iosX64, 'ios') {
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
compilations.main {
outputKinds('FRAMEWORK')
cinterops {
firebase {
defFile "$projectDir/src/iosMain/cinterop/firebase.def"
includeDirs {
allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
"$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
}
compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
}
}
}
}
end this .def
file:
language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h
What's going on here ? Cocopods frameworks are placed in Pods
directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public
folder. and it contains references to other header files it needs... So you specify these files names in your .def
file in headers section.
Next you need to specify where to look for these files and other referenced by them. You can do it in .def
file in includeDirs
or in build.gradle
file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public
folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)
Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts
and linkerOpts
prefixing them with -F
if it is framework or -L
if it is library.
add a comment |
I ended up with this cinterops
section in build.gradle
fromPreset(presets.iosX64, 'ios') {
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
compilations.main {
outputKinds('FRAMEWORK')
cinterops {
firebase {
defFile "$projectDir/src/iosMain/cinterop/firebase.def"
includeDirs {
allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
"$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
}
compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
}
}
}
}
end this .def
file:
language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h
What's going on here ? Cocopods frameworks are placed in Pods
directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public
folder. and it contains references to other header files it needs... So you specify these files names in your .def
file in headers section.
Next you need to specify where to look for these files and other referenced by them. You can do it in .def
file in includeDirs
or in build.gradle
file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public
folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)
Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts
and linkerOpts
prefixing them with -F
if it is framework or -L
if it is library.
I ended up with this cinterops
section in build.gradle
fromPreset(presets.iosX64, 'ios') {
// This preset is for iPhone emulator
// Switch here to presets.iosArm64 (or iosArm32) to build library for iPhone device
compilations.main {
outputKinds('FRAMEWORK')
cinterops {
firebase {
defFile "$projectDir/src/iosMain/cinterop/firebase.def"
includeDirs {
allHeaders "$projectDir/../iosApp/Pods/FirebaseCore/Firebase/Core/Public",
"$projectDir/../iosApp/Pods/FirebaseDatabase/Firebase/Database/Public"
}
compilerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
linkerOpts "-F$projectDir/../iosApp/Pods/Firebase -F$projectDir/../iosApp/Pods/FirebaseCore -F$projectDir/../iosApp/Pods/FirebaseDatabase"
}
}
}
}
end this .def
file:
language = Objective-C
headers = FirebaseCore.h FirebaseDatabase.h
What's going on here ? Cocopods frameworks are placed in Pods
directory in your xcode project. Navigating a bit this folder you'll find what you need. I'm not sure if there is some standart but firebase place main header file in Public
folder. and it contains references to other header files it needs... So you specify these files names in your .def
file in headers section.
Next you need to specify where to look for these files and other referenced by them. You can do it in .def
file in includeDirs
or in build.gradle
file. I prefere build.gradle file as it can use variables. So you specyfy path to these Public
folders. (This is enough for kotlin to see library api, but in order to be able to run app you need to compile and link this library...)
Than compiler and linker needs to know where library/framework is itself. So you specify path to root folder of framework in compilerOpts
and linkerOpts
prefixing them with -F
if it is framework or -L
if it is library.
answered Jan 18 at 12:31
oleg.semenoleg.semen
1,2751537
1,2751537
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54005467%2fkotlin-multiplatform-native-interoperability-with-objective-c-framework%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Ul,F20B