Use CSA_ as prefix for Canadian Multilingual key aliases

CM is already used for Colemak.
pull/746/head
Didier Loiseau 9 years ago
parent 911222892e
commit 3a91ddb074

@ -111,10 +111,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[LR_CSA] = KEYMAP(
// left hand
KC_DLR, CM_DQOT, CM_LGIL, CM_RGIL, KC_LPRN, KC_RPRN, KC_DELT,
KC_TAB, KC_B, CM_ECUT, KC_P, KC_O, CM_EGRV, KC_BSPC,
KC_DLR, CSA_DQOT, CSA_LGIL, CSA_RGIL, KC_LPRN, KC_RPRN, KC_DELT,
KC_TAB, KC_B, CSA_ECUT, KC_P, KC_O, CSA_EGRV, KC_BSPC,
KC_EQL, KC_A, KC_U, KC_I, KC_E, KC_COMM,
M(M_CMSFT), CM_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT,
M(M_CMSFT), CSA_AGRV, KC_Y, KC_X, KC_DOT, KC_K, KC_ENT,
KC_LCTL, M(M_FNLR), KC_LGUI, KC_MPLY, ALT_T(KC_APP),
ALT_T(KC_ESC), TG(LR_NUMR),
@ -122,11 +122,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_SPC, KC_LSFT, KC_PGDN,
// right hand
KC_DELT, KC_AT, KC_PLUS, KC_MINS, CM_SLSH, KC_ASTR, KC_W,
KC_BSPC, CM_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z,
KC_DELT, KC_AT, KC_PLUS, KC_MINS, CSA_SLSH, KC_ASTR, KC_W,
KC_BSPC, CSA_DCRC, KC_V, KC_D, KC_L, KC_J, KC_Z,
KC_C, KC_T, KC_S, KC_R, KC_N, KC_M,
KC_ENT, CM_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT),
MO(LR_CSA_AGR), KC_PERC, KC_HOME, CM_CCED, CTL_T(KC_END),
KC_ENT, CSA_APOS, KC_Q, KC_G, KC_H, KC_F, M(M_CMSFT),
MO(LR_CSA_AGR), KC_PERC, KC_HOME, CSA_CCED, CTL_T(KC_END),
KC_LEFT, KC_RGHT,
KC_UP,
@ -169,7 +169,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_TRNS, M(M_6), M(M_7), M(M_8), M(M_9), M(M_0), KC_TRNS,
KC_TRNS, KC_EXLM, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, CM_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, CSA_QEST, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, M(M_GRV), KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
@ -200,10 +200,10 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
*/
[LR_CSA_AGR] = KEYMAP(
// left hand
MUC(NDSH),MUC(MDSH),CM_LESS, CM_GRTR, CM_LBRC, CM_RBRC, KC_TRNS,
KC_TRNS, CM_PIPE, CM_DACT, KC_AMPR, CM_OE, CM_DGRV, KC_TRNS,
KC_NO, CM_AE, CM_UGRV, CM_DTRM, CM_EURO, CM_RQOT,
KC_TRNS, CM_BSLS, CM_LCBR, CM_RCBR, MUC(ELPS),CM_TILD, KC_TRNS,
MUC(NDSH), MUC(MDSH), CSA_LESS, CSA_GRTR, CSA_LBRC, CSA_RBRC, KC_TRNS,
KC_TRNS, CSA_PIPE, CSA_DACT, KC_AMPR, CSA_OE, CSA_DGRV, KC_TRNS,
KC_NO, CSA_AE, CSA_UGRV, CSA_DTRM, CSA_EURO, CSA_RQOT,
KC_TRNS, CSA_BSLS, CSA_LCBR, CSA_RCBR, MUC(ELPS), CSA_TILD, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS,
@ -211,11 +211,11 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_UNDS, KC_TRNS, KC_TRNS,
// right hand
KC_TRNS, M(M_CRC), CM_PSMS, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_NO, KC_NO, CM_ETH, KC_NO, CM_IJ, KC_NO,
KC_NO, CM_THRN, CM_SRPS, KC_NO, CM_DTLD, KC_TRNS,
KC_TRNS, KC_NO, KC_NO, CM_MU, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_NO, KC_TRNS, CM_DCED, KC_TRNS,
KC_TRNS, M(M_CRC), CSA_PSMS, KC_NO, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_NO, KC_NO, CSA_ETH, KC_NO, CSA_IJ, KC_NO,
KC_NO, CSA_THRN, CSA_SRPS, KC_NO, CSA_DTLD, KC_TRNS,
KC_TRNS, KC_NO, KC_NO, CSA_MU, KC_NO, KC_NO, KC_NO,
KC_TRNS, KC_NO, KC_TRNS, CSA_DCED, KC_TRNS,
KC_TRNS, KC_TRNS,
KC_TRNS,
@ -385,13 +385,13 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
register_code(KC_1 + (id - M_1));
break;
case M_DEGR:
return MACRO(DOWN(CM_ALTGR), D(SCLN), END);
return MACRO(DOWN(CSA_ALTGR), D(SCLN), END);
case M_SCLN:
return MACRO(D(SCLN), END);
case M_GRV:
return MACRO(DOWN(CM_ALTGR), TYPE(CM_DCRC), UP(CM_ALTGR), T(SPACE), END);
return MACRO(DOWN(CSA_ALTGR), TYPE(CSA_DCRC), UP(CSA_ALTGR), T(SPACE), END);
case M_NBSP:
return MACRO(DOWN(CM_ALTGR), T(SPACE), UP(CM_ALTGR), END);
return MACRO(DOWN(CSA_ALTGR), T(SPACE), UP(CSA_ALTGR), END);
}
} else {
hold_shift();
@ -400,7 +400,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
unregister_code(KC_1 + (id - M_1));
break;
case M_DEGR:
return MACRO(UP(CM_ALTGR), D(LSFT), U(SCLN), END);
return MACRO(UP(CSA_ALTGR), D(LSFT), U(SCLN), END);
case M_SCLN:
return MACRO(D(LSFT), U(SCLN), END);
}
@ -408,7 +408,7 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
break;
case M_CRC:
if (record->event.pressed) {
return MACRO(TYPE(CM_DCRC), T(SPACE), END);
return MACRO(TYPE(CSA_DCRC), T(SPACE), END);
}
break;
case M_DBL0:

@ -11,8 +11,8 @@
#define ALGR(kc) ALTGR(kc)
#endif
#define CM_ALTGR KC_RALT
#define CM_ALGR CM_ALTGR
#define CSA_ALTGR KC_RALT
#define CSA_ALGR CSA_ALTGR
#ifndef GR2A
#define GR2A(kc) RCTL(kc)
@ -20,170 +20,172 @@
// Normal characters
// First row
#define CM_SLASH KC_GRV // /
#define CM_SLSH CM_SLASH
#define CSA_SLASH KC_GRV // /
#define CSA_SLSH CSA_SLASH
// Second row
#define CM_DEAD_CIRCUMFLEX KC_LBRACKET // dead ^
#define CM_DCRC CM_DEAD_CIRCUMFLEX
#define CM_C_CEDILLA KC_RBRACKET // Ç
#define CM_CCED CM_C_CEDILLA
#define CSA_DEAD_CIRCUMFLEX KC_LBRACKET // dead ^
#define CSA_DCRC CSA_DEAD_CIRCUMFLEX
#define CSA_C_CEDILLA KC_RBRACKET // Ç
#define CSA_CCED CSA_C_CEDILLA
// Third row
#define CM_E_GRAVE KC_QUOT // è
#define CM_EGRV CM_E_GRAVE
#define CM_A_GRAVE KC_BSLASH // à
#define CM_AGRV CM_A_GRAVE
#define CSA_E_GRAVE KC_QUOT // è
#define CSA_EGRV CSA_E_GRAVE
#define CSA_A_GRAVE KC_BSLASH // à
#define CSA_AGRV CSA_A_GRAVE
// Fourth row
#define CM_U_GRAVE KC_NONUS_BSLASH // ù
#define CM_UGRV CM_U_GRAVE
#define CM_E_ACUTE KC_SLSH // é
#define CM_ECUT CM_E_ACUTE
#define CSA_U_GRAVE KC_NONUS_BSLASH // ù
#define CSA_UGRV CSA_U_GRAVE
#define CSA_E_ACUTE KC_SLSH // é
#define CSA_ECUT CSA_E_ACUTE
// Shifted characters
// First row
#define CM_BACKSLASH LSFT(CM_SLASH) /* \ */
#define CM_BSLS CM_BACKSLASH
#define CM_QUESTION LSFT(KC_6) // ?
#define CM_QEST CM_QUESTION
#define CSA_BACKSLASH LSFT(CSA_SLASH) /* \ */
#define CSA_BSLS CSA_BACKSLASH
#define CSA_QUESTION LSFT(KC_6) // ?
#define CSA_QEST CSA_QUESTION
// Second row
#define CM_DEAD_TREMA LSFT(CM_DEAD_CIRCUMFLEX) // dead trema/umlaut/diaresis for ä ë ï ö ü
#define CM_DTRM CM_DEAD_TREMA
#define CSA_DEAD_TREMA LSFT(CSA_DEAD_CIRCUMFLEX) // dead trema/umlaut/diaresis for ä ë ï ö ü
#define CSA_DTRM CSA_DEAD_TREMA
// Third row
// all same as US-QWERTY, or capitalised character of the non-shifted key
// Fourth row
#define CM_APOSTROPHE LSFT(KC_COMMA) // '
#define CM_APOS CM_APOSTROPHE
#define CM_DOUBLE_QUOTE LSFT(KC_DOT) // "
#define CM_DQOT CM_DOUBLE_QUOTE
#define CSA_APOSTROPHE LSFT(KC_COMMA) // '
#define CSA_APOS CSA_APOSTROPHE
#define CSA_DOUBLE_QUOTE LSFT(KC_DOT) // "
#define CSA_DQOT CSA_DOUBLE_QUOTE
// Alt Gr-ed characters
// First row
#define CM_PIPE ALTGR(CM_SLASH) // |
#define CM_CURRENCY ALTGR(KC_4) // ¤
#define CM_CURR CM_CURRENCY
#define CM_LEFT_CURLY_BRACE ALTGR(KC_7) // {
#define CM_LCBR CM_LEFT_CURLY_BRACE
#define CM_RIGHT_CURLY_BRACE ALTGR(KC_8) // }
#define CM_RCBR CM_RIGHT_CURLY_BRACE
#define CM_LBRACKET ALTGR(KC_9) // [
#define CM_LBRC CM_LBRACKET
#define CM_RBRACKET ALTGR(KC_0) // ]
#define CM_RBRC CM_RBRACKET
#define CM_NEGATION ALTGR(KC_EQUAL) // ¬
#define CM_NEGT CM_NEGATION
#define CSA_PIPE ALTGR(CSA_SLASH) // |
#define CSA_CURRENCY ALTGR(KC_4) // ¤
#define CSA_CURR CSA_CURRENCY
#define CSA_LEFT_CURLY_BRACE ALTGR(KC_7) // {
#define CSA_LCBR CSA_LEFT_CURLY_BRACE
#define CSA_RIGHT_CURLY_BRACE ALTGR(KC_8) // }
#define CSA_RCBR CSA_RIGHT_CURLY_BRACE
#define CSA_LBRACKET ALTGR(KC_9) // [
#define CSA_LBRC CSA_LBRACKET
#define CSA_RBRACKET ALTGR(KC_0) // ]
#define CSA_RBRC CSA_RBRACKET
#define CSA_NEGATION ALTGR(KC_EQUAL) // ¬
#define CSA_NEGT CSA_NEGATION
// Second row
// euro symbol not available on Linux? (X.org)
#define CM_EURO ALTGR(KC_E) // €
#define CM_DEAD_GRAVE ALTGR(CM_DEAD_CIRCUMFLEX)
#define CM_DGRV CM_DEAD_GRAVE // dead `
#define CM_TILDE ALTGR(CM_C_CEDILLA) // ~
#define CM_TILD CM_TILDE
#define CSA_EURO ALTGR(KC_E) // €
#define CSA_DEAD_GRAVE ALTGR(CSA_DEAD_CIRCUMFLEX)
#define CSA_DGRV CSA_DEAD_GRAVE // dead `
#define CSA_TILDE ALTGR(CSA_C_CEDILLA) // ~
#define CSA_TILD CSA_TILDE
// Third row
#define CM_DEGREE ALTGR(KC_SCOLON) // °
#define CM_DEGR CM_DEGREE
#define CSA_DEGREE ALTGR(KC_SCOLON) // °
#define CSA_DEGR CSA_DEGREE
// Fourth row
#define CM_LEFT_GUILLEMET ALTGR(KC_Z) // «
#define CM_LGIL CM_LEFT_GUILLEMET
#define CM_RIGHT_GUILLEMET ALTGR(KC_X) // »
#define CM_RGIL CM_RIGHT_GUILLEMET
#define CM_LESS ALTGR(KC_COMMA) // <
#define CM_GREATER ALTGR(KC_DOT) // >
#define CM_GRTR CM_GREATER
#define CSA_LEFT_GUILLEMET ALTGR(KC_Z) // «
#define CSA_LGIL CSA_LEFT_GUILLEMET
#define CSA_RIGHT_GUILLEMET ALTGR(KC_X) // »
#define CSA_RGIL CSA_RIGHT_GUILLEMET
#define CSA_LESS ALTGR(KC_COMMA) // <
#define CSA_GREATER ALTGR(KC_DOT) // >
#define CSA_GRTR CSA_GREATER
// Space bar
#define CM_NON_BREAKING_SPACE ALTGR(KC_SPACE)
#define CM_NBSP CM_NON_BREAKING_SPACE
#define CSA_NON_BREAKING_SPACE ALTGR(KC_SPACE)
#define CSA_NBSP CSA_NON_BREAKING_SPACE
// GR2A-ed characters (non-exhaustive list)
// First row
#define CM_SUPERSCRIPT_ONE GR2A(KC_1) // ¹
#define CM_SUP1 CM_SUPERSCRIPT_ONE
#define CM_SUPERSCRIPT_TWO GR2A(KC_2) // ²
#define CM_SUP2 CM_SUPERSCRIPT_TWO
#define CM_SUPERSCRIPT_THREE GR2A(KC_3) // ³
#define CM_SUP3 CM_SUPERSCRIPT_THREE
#define CM_ONE_QUARTER GR2A(KC_4) // ¼
#define CM_1QRT CM_ONE_QUARTER
#define CM_ONE_HALF GR2A(KC_5) // ½
#define CM_1HLF CM_ONE_HALF
#define CM_THREE_QUARTERS GR2A(KC_6) // ¾
#define CM_3QRT CM_THREE_QUARTERS
#define CSA_SUPERSCRIPT_ONE GR2A(KC_1) // ¹
#define CSA_SUP1 CSA_SUPERSCRIPT_ONE
#define CSA_SUPERSCRIPT_TWO GR2A(KC_2) // ²
#define CSA_SUP2 CSA_SUPERSCRIPT_TWO
#define CSA_SUPERSCRIPT_THREE GR2A(KC_3) // ³
#define CSA_SUP3 CSA_SUPERSCRIPT_THREE
#define CSA_ONE_QUARTER GR2A(KC_4) // ¼
#define CSA_1QRT CSA_ONE_QUARTER
#define CSA_ONE_HALF GR2A(KC_5) // ½
#define CSA_1HLF CSA_ONE_HALF
#define CSA_THREE_QUARTERS GR2A(KC_6) // ¾
#define CSA_3QRT CSA_THREE_QUARTERS
// nothing on 7-0 and -
#define CM_DEAD_CEDILLA GR2A(KC_EQUAL) // dead ¸
#define CM_DCED CM_DEAD_CEDILLA
#define CSA_DEAD_CEDILLA GR2A(KC_EQUAL) // dead ¸
#define CSA_DCED CSA_DEAD_CEDILLA
// Second row
#define CM_OMEGA GR2A(KC_Q) // ω
#define CM_OMEG CM_OMEGA
#define CM_L_STROKE GR2A(KC_W) // ł
#define CM_LSTK CM_L_STROKE
#define CM_OE_LIGATURE GR2A(KC_E) // œ
#define CM_OE CM_OE_LIGATURE
#define CM_PARAGRAPH GR2A(KC_R) // ¶
#define CM_PARG CM_PARAGRAPH
#define CM_T_STROKE GR2A(KC_T) // ŧ
#define CM_LEFT_ARROW GR2A(KC_Y) // ←
#define CM_LARW CM_LEFT_ARROW
#define CM_DOWN_ARROW GR2A(KC_U) // ↓
#define CM_DARW CM_DOWN_ARROW
#define CM_RIGHT_ARROW GR2A(KC_I) // →
#define CM_RARW CM_RIGHT_ARROW
#define CM_O_STROKE GR2A(KC_O) // ø
#define CM_OSTK CM_O_STROKE
#define CM_THORN GR2A(KC_P) // þ
#define CM_THRN CM_THORN
#define CSA_OMEGA GR2A(KC_Q) // ω
#define CSA_OMEG CSA_OMEGA
#define CSA_L_STROKE GR2A(KC_W) // ł
#define CSA_LSTK CSA_L_STROKE
#define CSA_OE_LIGATURE GR2A(KC_E) // œ
#define CSA_OE CSA_OE_LIGATURE
#define CSA_PARAGRAPH GR2A(KC_R) // ¶
#define CSA_PARG CSA_PARAGRAPH
#define CSA_T_STROKE GR2A(KC_T) // ŧ
#define CSA_LEFT_ARROW GR2A(KC_Y) // ←
#define CSA_LARW CSA_LEFT_ARROW
#define CSA_DOWN_ARROW GR2A(KC_U) // ↓
#define CSA_DARW CSA_DOWN_ARROW
#define CSA_RIGHT_ARROW GR2A(KC_I) // →
#define CSA_RARW CSA_RIGHT_ARROW
#define CSA_O_STROKE GR2A(KC_O) // ø
#define CSA_OSTK CSA_O_STROKE
#define CSA_THORN GR2A(KC_P) // þ
#define CSA_THRN CSA_THORN
// nothing on ^
#define CM_DEAD_TILDE GR2A(CM_C_CEDILLA) // dead ~
#define CM_DTLD CM_DEAD_TILDE
#define CSA_DEAD_TILDE GR2A(CSA_C_CEDILLA) // dead ~
#define CSA_DTLD CSA_DEAD_TILDE
// Third row
#define CM_AE_LIGATURE GR2A(KC_A) // æ
#define CM_AE CM_AE_LIGATURE
#define CM_SHARP_S GR2A(KC_S) // ß
#define CM_SRPS CM_SHARP_S
#define CM_ETH GR2A(KC_D) // ð
#define CSA_AE_LIGATURE GR2A(KC_A) // æ
#define CSA_AE CSA_AE_LIGATURE
#define CSA_SHARP_S GR2A(KC_S) // ß
#define CSA_SRPS CSA_SHARP_S
#define CSA_ETH GR2A(KC_D) // ð
// nothing on F
#define CM_ENG GR2A(KC_G) // ŋ
#define CM_H_SRTOKE GR2A(KC_H) // ħ
#define CM_HSTK CM_H_SRTOKE
#define CM_IJ_LIGATURE GR2A(KC_J) // ij
#define CM_IJ CM_IJ_LIGATURE
#define CM_KRA GR2A(KC_K) // ĸ
#define CM_L_FLOWN_DOT GR2A(KC_L) // ŀ
#define CM_LFLD CM_L_FLOWN_DOT
#define CM_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent
#define CM_DACT CM_DEAD_ACUTE
#define CSA_ENG GR2A(KC_G) // ŋ
#define CSA_H_SRTOKE GR2A(KC_H) // ħ
#define CSA_HSTK CSA_H_SRTOKE
#define CSA_IJ_LIGATURE GR2A(KC_J) // ij
#define CSA_IJ CSA_IJ_LIGATURE
#define CSA_KRA GR2A(KC_K) // ĸ
#define CSA_L_FLOWN_DOT GR2A(KC_L) // ŀ
#define CSA_LFLD CSA_L_FLOWN_DOT
#define CSA_DEAD_ACUTE GR2A(KC_SCLN) // dead acute accent
#define CSA_DACT CSA_DEAD_ACUTE
// nothing on È & À
// Fourth row
#define CM_CENT GR2A(KC_C) // ¢
#define CM_LEFT_DOUBLE_QUOTE GR2A(KC_V) // “
#define CM_LDQT CM_LEFT_DOUBLE_QUOTE
#define CM_RIGHT_DOUBLE_QUOTE GR2A(KC_B) // ”
#define CM_RDQT CM_RIGHT_DOUBLE_QUOTE
#define CM_N_APOSTROPHE GR2A(KC_N) // ʼn (deprecated unicode codepoint)
#define CM_NAPO CM_N_APOSTROPHE
#define CM_MU GR2A(KC_M) // μ
// ─ TODO box drawing character?
#define CM_HYPHENATION_POINT GR2A(CM_DOT) // ‧ TODO not an interpunct ?
#define CSA_CENT GR2A(KC_C) // ¢
#define CSA_LEFT_DOUBLE_QUOTE GR2A(KC_V) // “
#define CSA_LDQT CSA_LEFT_DOUBLE_QUOTE
#define CSA_RIGHT_DOUBLE_QUOTE GR2A(KC_B) // ”
#define CSA_RDQT CSA_RIGHT_DOUBLE_QUOTE
#define CSA_N_APOSTROPHE GR2A(KC_N) // ʼn (deprecated unicode codepoint)
#define CSA_NAPO CSA_N_APOSTROPHE
#define CSA_MU GR2A(KC_M) // μ
#define CSA_HORIZONTAL_BAR GR2A(KC_COMMA) // ―
#define CSA_HZBR CSA_HORIZONTAL_BAR
#define CSA_DEAD_DOT_ABOVE GR2A(KC_DOT) // dead ˙
#define CSA_DOTA CSA_DEAD_DOT_ABOVE
// GR2A-shifted characters (non-exhaustive list)
// First row
#define CM_PLUS_MINUS LSFT(GR2A(KC_9)) // ±
#define CM_PSMS CM_PLUS_MINUS
#define CSA_PLUS_MINUS LSFT(GR2A(KC_9)) // ±
#define CSA_PSMS CSA_PLUS_MINUS
// Fourth row
#define CM_LEFT_QUOTE LSFT(GR2A(KC_V)) //
#define CM_LQOT CM_LEFT_QUOTE
#define CM_RIGHT_QUOTE LSFT(GR2A(KC_B)) //
#define CM_RQOT CM_RIGHT_QUOTE
#define CSA_LEFT_QUOTE LSFT(GR2A(KC_V)) //
#define CSA_LQOT CSA_LEFT_QUOTE
#define CSA_RIGHT_QUOTE LSFT(GR2A(KC_B)) //
#define CSA_RQOT CSA_RIGHT_QUOTE
#endif

Loading…
Cancel
Save