adding files and main README-JP.md

pull/18/head
Patricio Gonzalez Vivo 9 years ago
parent 7e1cc55cfb
commit 9b83d28c46

@ -2,21 +2,21 @@
$path = "..";
$subtitle = ": about this book";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header">
<p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a> </p>
<p>Translations: <a href=".">English</a> - <a href="?lan=jp">Japanese</a></p>
</div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
$README = "README";
if(!empty($_GET['lan']))
$README .= '-'.$_GET['lan'];
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents($README.'.md'));

@ -2,21 +2,21 @@
$path = "..";
$subtitle = ": What is a shader?";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header">
<p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a> </p>
<p>Translations: <a href=".">English</a> - <a href="?lan=jp">Japanese</a></p>
</div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
$README = "README";
if(!empty($_GET['lan']))
$README .= '-'.$_GET['lan'];
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents($README.'.md'));

@ -2,21 +2,21 @@
$path = "..";
$subtitle = ": Hello world!";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header">
<p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a> </p>
<p>Translations: <a href=".">English</a> - <a href="?lan=jp">Japanese</a></p>
</div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
$README = "README";
if(!empty($_GET['lan']))
$README .= '-'.$_GET['lan'];
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents($README.'.md'));

@ -2,21 +2,21 @@
$path = "..";
$subtitle = ": uniforms";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header">
<p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a> </p>
<p>Translations: <a href=".">English</a> - <a href="?lan=jp">Japanese</a></p>
</div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
$README = "README";
if(!empty($_GET['lan']))
$README .= '-'.$_GET['lan'];
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents($README.'.md'));

@ -2,21 +2,21 @@
$path = "..";
$subtitle = ": Running your shader";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header">
<p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a> </p>
<p>Translations: <a href=".">English</a> - <a href="?lan=jp">Japanese</a></p>
</div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
$README = "README";
if(!empty($_GET['lan']))
$README .= '-'.$_GET['lan'];
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents($README.'.md'));

@ -1,19 +1,25 @@
<?php
$path = "..";
$subtitle = ": shaping functions";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$subtitle = ": Shaping functions";
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>
<hr>

@ -2,17 +2,23 @@
$path = "..";
$subtitle = ": color";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -2,17 +2,23 @@
$path = "..";
$subtitle = ": Shapes";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -2,17 +2,23 @@
$path = "..";
$subtitle = ": 2D Matrices";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -2,17 +2,23 @@
$path = "..";
$subtitle = ": Patterns";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -2,17 +2,23 @@
$path = "..";
$subtitle = ": Random";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -2,17 +2,23 @@
$path = "..";
$subtitle = ": Noise";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -1,17 +1,24 @@
<?php
$path = "..";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$subtitle = ": Fractal Brownian Motion";
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -1,17 +1,24 @@
<?php
$path = "..";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$subtitle = ": Fractals";
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -1,17 +1,23 @@
<?php
$path = "..";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -1,17 +1,23 @@
<?php
$path = "..";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -1,17 +1,23 @@
<?php
$path = "..";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -1,17 +1,23 @@
<?php
$path = "..";
include($path."/header.php");
include($path."/src/parsedown/Parsedown.php");
$README = "README";
$language = "";
echo '
<div class="header"><p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a></p></div>
<hr>
<div id="content">
';
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include($path."/header.php");
include($path."/chap-header.php");
echo '<div id="content">';
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '
</div>

@ -0,0 +1,98 @@
<canvas id="custom" class="canvas" data-fragment-url="examples/moon.frag" data-textures="examples/images/moon-texture.jpg" width="350px" height="350px"></canvas>
# The Book of Shaders
*by [Patricio Gonzalez Vivo](http://patriciogonzalezvivo.com/)*
This is a gentle step-by-step guide through the abstract and complex universe of Fragment Shaders.
## Translation notes
<div class="header">
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=B5FSVSHGEATCG" style="float: right;"><img src="https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif" alt=""></a>
</div>
## Contents
* [About this book](00/?lan=jp)
* Getting started
* [What is a shader?](01/?lan=jp)
* [“Hello world!”](02/?lan=jp)
* [Uniforms](03/?lan=jp)
* [Running your shader](04/?lan=jp)
* Algorithmic drawing
* [Shaping functions](05/)
* [Colors](06/)
* [Shapes](07/)
* [Matrices](08/)
* [Patterns](09/)
* Generative designs
* [Random](10/)
* Noise
* Fractional brownian motion
* Fractals
* Image processing:
* Textures
* Image operations
* Kernel convolutions
* Filters
* Others effects
* Simulation
* Pingpong
* Conway
* Ripples
* Water color
* Reaction diffusion
* Voronoi
* 3D graphics
* Lights
* Normal-maps
* Bump-maps
* Ray marching
* Environmental-maps (spherical and cube)
* Reflect and refract
* [Appendix:](appendix/) Other ways to use this book
* [How can I navigate this book offline?](appendix/)
* [How to run the examples on a RaspberryPi?](appendix/)
* [How to print this book?](appendix/)
* [Examples Gallery](examples/)
* [Glossary](glossary/)
## About the Author
[Patricio Gonzalez Vivo](http://patriciogonzalezvivo.com/) (1982, Buenos Aires, Argentina) is a New York based artist and developer. He explores interstitial spaces between organic and synthetic, analog and digital, individual and collective. In his work he uses code as an expressive language with the intention of developing a better together.
Patricio studied and practiced psychotherapy and expressive art therapy. He holds an MFA in Design & Technology from Parsons The New School, where he now teaches. Currently he works as a Graphic Engineer at Mapzen making openSource mapping tools.
<div class="header"><a href="https://twitter.com/patriciogv" target="_blank">Twitter</a> - <a href="https://github.com/patriciogonzalezvivo" target="_blank">GitHub</a> - <a href="https://vimeo.com/patriciogv" target="_blank">Vimeo</a> - <a href="https://www.flickr.com/photos/106950246@N06/" target="_blank"> Flickr</a></div>
## About the Translator
[Kenichi Yoneda (Kynd)](https://twitter.com/kyndinfo) ...
## Acknowledgements
Thanks to my wife [Jen Lowe](http://www.datatelling.com/), for her unconditional support, help and time editing this book.
Thanks [Scott Murray](http://alignedleft.com/) for the inspiration and advice.
Thanks [Kenichi Yoneda (Kynd)](https://twitter.com/kyndinfo) for the [Japanese translation](?lan=jp)
Thanks [Karim Naaji](http://karim.naaji.fr/) for contributing with support, good ideas and code.
Thanks to everyone who has believed in this project and [contributed with fixes](https://github.com/patriciogonzalezvivo/thebookofshaders/graphs/contributors) or donations.
## Get new chapters
Sign up for the news letter or [follow it on Twitter](https://twitter.com/bookofshaders)
<form style="border:1px solid #ccc;padding:3px;text-align:center;" action="https://tinyletter.com/thebookofshaders" method="post" target="popupwindow" onsubmit="window.open('https://tinyletter.com/thebookofshaders', 'popupwindow', 'scrollbars=yes,width=800,height=600');return true"><a href="https://tinyletter.com/thebookofshaders"><p><label for="tlemail">Enter your email address</label></p></a><p><input type="text" style="width:140px" name="email" id="tlemail" /></p><input type="hidden" value="1" name="embed"/><input type="submit" value="Subscribe" /><p><a href="https://tinyletter.com" target="_blank"></a></p></form>

@ -78,11 +78,11 @@ Thanks to my wife [Jen Lowe](http://www.datatelling.com/), for her unconditional
Thanks [Scott Murray](http://alignedleft.com/) for the inspiration and advice.
Thanks [Kynd.info](https://twitter.com/kyndinfo) for the [Japanese translation](00/?lan=jp)
Thanks [Kenichi Yoneda (Kynd)](https://twitter.com/kyndinfo) for the [Japanese translation](?lan=jp)
Thanks [Karim Naaji](http://karim.naaji.fr/) for contributing with support, good ideas and code.
Thanks to everyone who has believed in this project and contributed with fixes or donations.
Thanks to everyone who has believed in this project and [contributed with fixes](https://github.com/patriciogonzalezvivo/thebookofshaders/graphs/contributors) or donations.
## Get new chapters

@ -0,0 +1,11 @@
<?php
echo '
<div class="header">
<p><a href="http://patriciogonzalezvivo.com/2015/thebookofshaders/">The Book of Shaders</a> by <a href="http://patriciogonzalezvivo.com">Patricio Gonzalez Vivo</a> </p>
<p>Translations: <a href=".">English</a> - <a href="?lan=jp">Japanese</a></p>
</div>
<hr>
';
?>

@ -42,10 +42,21 @@ echo '
<!-- My stuff -->
<link type="text/css" rel="stylesheet" href="'.$path.'/css/style.css">
<!--<link type="text/css" rel="stylesheet" href="'.$path.'/css/style-jp.css">-->
<script type="text/javascript" src="https://rawgit.com/patriciogonzalezvivo/glslCanvas/master/build/GlslCanvas.min.js"></script>
</style>
<!-- Translation -->
';
if ( $language !== '' && file_exists($path.'/css/style'.$language.'.css') ) {
echo '<link type="text/css" rel="stylesheet" href="'.$path.'/css/style'.$language.'.css">';
}
echo '
</head>
<body>
';
?>

@ -1,10 +1,23 @@
<?php
$path = ".";
$README = "README";
$language = "";
if ( !empty($_GET['lan']) ) {
if (file_exists($README.'-'.$_GET['lan'].'.md')) {
$language = '-'.$_GET['lan'];
$README .= $language;
}
}
include("header.php");
echo '<div id="content">';
include("src/parsedown/Parsedown.php");
include($path."/src/parsedown/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents ('README.md'));
echo $Parsedown->text(file_get_contents($README.'.md'));
echo '</div>';
include("footer.php");
?>
Loading…
Cancel
Save