diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c2bca8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +config.ini +.ftpconfig \ No newline at end of file diff --git a/README.md b/README.md index d9ac882..875d348 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,62 @@ -# halcyon -A Mastodon web client that looks like Twitter - Demo at https://halcyon.cybre.space +# Halcyon for Mastodon +A Mastodon web client that looks like Twitter + +>The original author of this genious piece of software was inactive for a while and then shut down his demo instance and deleted this repository. I love Halcyon, it's the thing which makes Mastodon the best social network in the world. I took the Code from the Halcyon fork of cybre.space which still works but doesn't seem to get updates, too. I uploaded it here to make the original link work again and don't link into the big nothing. I'm working on much other stuff, too, what is why I won't be very active here in the near future but I do things which are required to keep it working and if I have much more time, I already know some nice features which could come. As for now I don't have an own demo instance but the one from cybre.space works pretty good and when I changed many things, I will open an own one. + + + +## Demo +https://halcyon.cybre.space/ +Please note that this demo is not owned by me and I have not control over it. Currently I'm not providing an own demo so I link to that one. That may change in future. + +## Features +- Twitter like UI, familiar interface. +- Able to use on all instances. +- No tracking, No ads. + +## Requirement +- Apache +- PHP +- MySQL + +## Setup +I didn't prepared setup script so you have to setup manually... + +### PDO MySQL + +After installed PHP, run this. + +```bash +sudo pecl install pdo_mysql +sudo vi php.ini +``` + +change to this + +```php.ini +extension=mysqli.so +extension=pdo_mysql.so +``` + +### MySQL +After installed MySQL, create a user, run this. +```sql +CREATE DATABASE DATABASE_NAME DEFAULT CHARACTER SET utf8; +CREATE TABLE DATABASE_NAME.instances(domain varchar(261), client_id varchar(64), client_secret varchar(64)); +``` +and make file `/config.ini` like this +```config.ini +~~~ line 3 ~~~ +api_client_name = +api_client_website = +~~~ line 8 ~~~ +db_host = +db_user = +db_pass = +db_name = +``` + +## Credits + +- [Kirschn/mastodon.js](https://github.com/Kirschn/mastodon.js) +- [yks118/Mastodon-api-php](https://github.com/yks118/Mastodon-api-php) diff --git a/Roadmap.md b/Roadmap.md new file mode 100644 index 0000000..85e312c --- /dev/null +++ b/Roadmap.md @@ -0,0 +1,17 @@ +# Roadmap + +These plans may change if I think something else is more important or if I consider something here as not that important! + +## Next version +- [x] Oauth login +- [x] Support responsive +- [ ] Add meida attachment's next/prev button + +## Future +- [ ] Multi account +- [ ] Emoji picker +- [ ] Native profile edit +- [ ] Dark theme +- [ ] Translation support +- [ ] Mobile devices support +- [ ] PHP PSR4 / Autoload diff --git a/authorize/Mastodon-api-php/LICENSE b/authorize/Mastodon-api-php/LICENSE new file mode 100755 index 0000000..efd99f7 --- /dev/null +++ b/authorize/Mastodon-api-php/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 KwangSeon Yun + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/authorize/Mastodon-api-php/Mastodon_api.php b/authorize/Mastodon-api-php/Mastodon_api.php new file mode 100755 index 0000000..0f5ee35 --- /dev/null +++ b/authorize/Mastodon-api-php/Mastodon_api.php @@ -0,0 +1,970 @@ + + * @copyright KwangSeon Yun + * @license https://raw.githubusercontent.com/yks118/Mastodon-api-php/master/LICENSE MIT License + * @link https://github.com/yks118/Mastodon-api-php + */ +class Mastodon_api { + private $mastodon_url = ''; + private $client_id = ''; + private $client_secret = ''; + + private $token = array(); + private $scopes = array(); + + public function __construct () {} + + public function __destruct () {} + + /** + * _post + * + * curl post + * + * @param string $url + * @param array $data + * + * @return array $response + */ + private function _post ($url,$data = array()) { + $parameters = array(); + $parameters[CURLOPT_POST] = 1; + + // set access_token + if (isset($this->token['access_token'])) { + $data['access_token'] = $this->token['access_token']; + } + + if (count($data)) { + $parameters[CURLOPT_POSTFIELDS] = http_build_query($data); + } + + $url = $this->mastodon_url.$url; + $response = $this->get_content_curl($url,$parameters); + return $response; + } + + /** + * _get + * + * @param string $url + * @param array $data + * + * @return array $response + */ + private function _get ($url,$data = array()) { + $parameters = array(); + + // set authorization bearer + if (isset($this->token['access_token'])) { + $authorization = 'Authorization: '.$this->token['token_type'].' '.$this->token['access_token']; + $parameters[CURLOPT_HTTPHEADER] = array('Content-Type: application/json',$authorization); + } + + $url = $this->mastodon_url.$url; + if (count($data)) { + $url .= '?'.http_build_query($data); + } + + $response = $this->get_content_curl($url,$parameters); + return $response; + } + + /** + * _patch + * + * @param string $url + * @param array $data + * + * @return array $parameters + */ + private function _patch ($url,$data = array()) { + $parameters = array(); + $parameters[CURLOPT_CUSTOMREQUEST] = 'PATCH'; + + // set authorization bearer + if (isset($this->token['access_token'])) { + $authorization = 'Authorization: '.$this->token['token_type'].' '.$this->token['access_token']; + $parameters[CURLOPT_HTTPHEADER] = array('Content-Type: application/json',$authorization); + } + + if (count($data)) { + $parameters[CURLOPT_POSTFIELDS] = json_encode($data); + } + + $url = $this->mastodon_url.$url; + $response = $this->get_content_curl($url,$parameters); + return $response; + } + + /** + * _delete + * + * @param string $url + * + * @return array $response + */ + private function _delete ($url) { + $parameters = array(); + $parameters[CURLOPT_CUSTOMREQUEST] = 'DELETE'; + + // set authorization bearer + if (isset($this->token['access_token'])) { + $authorization = 'Authorization: '.$this->token['token_type'].' '.$this->token['access_token']; + $parameters[CURLOPT_HTTPHEADER] = array('Content-Type: application/json',$authorization); + } + + $url = $this->mastodon_url.$url; + $response = $this->get_content_curl($url,$parameters); + return $response; + } + + /** + * get_content_curl + * + * @param string $url + * @param array $parameters + * + * @return array $data + */ + protected function get_content_curl ($url,$parameters = array()) { + $data = array(); + + // set CURLOPT_USERAGENT + if (!isset($parameters[CURLOPT_USERAGENT])) { + if (isset($_SERVER['HTTP_USER_AGENT'])) { + $parameters[CURLOPT_USERAGENT] = $_SERVER['HTTP_USER_AGENT']; + } else { + // default IE11 + $parameters[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'; + } + } + + // check curl_init + if (function_exists('curl_init')) { + $ch = curl_init(); + + // url 설정 + curl_setopt($ch,CURLOPT_URL,$url); + + foreach ($parameters as $key => $value) { + curl_setopt($ch,$key,$value); + } + + // https + if (!isset($parameters[CURLOPT_SSL_VERIFYPEER])) { + curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); + } + if (!isset($parameters[CURLOPT_SSLVERSION])) { + curl_setopt($ch,CURLOPT_SSLVERSION,6); + } + + // no header + if (!isset($parameters[CURLOPT_HEADER])) { + curl_setopt($ch,CURLOPT_HEADER,0); + } + + // POST / GET (default : GET) + if (!isset($parameters[CURLOPT_POST]) && !isset($parameters[CURLOPT_CUSTOMREQUEST])) { + curl_setopt($ch,CURLOPT_POST,0); + } + + // response get php value + if (!isset($parameters[CURLOPT_RETURNTRANSFER])) { + curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); + } + + // HTTP2 + if (!isset($parameters[CURLOPT_HTTP_VERSION])) { + curl_setopt($ch,CURLOPT_HTTP_VERSION,3); + } + if (!isset($parameters[CURLINFO_HEADER_OUT])) { + curl_setopt($ch,CURLINFO_HEADER_OUT,TRUE); + } + + $data['html'] = json_decode(curl_exec($ch),true); + $data['response'] = curl_getinfo($ch); + + curl_close($ch); + } + + return $data; + } + + /** + * set_url + * + * @param string $path + */ + public function set_url ($path) { + $this->mastodon_url = $path; + } + + /** + * set_client + * + * @param string $id + * @param string $secret + */ + public function set_client ($id,$secret) { + $this->client_id = $id; + $this->client_secret = $secret; + } + + /** + * set_token + * + * @param string $token + * @param string $type + */ + public function set_token ($token,$type) { + $this->token['access_token'] = $token; + $this->token['token_type'] = $type; + } + + /** + * set_scopes + * + * @param array $scopes read / write / follow + */ + public function set_scopes ($scopes) { + $this->scopes = $scopes; + } + + /** + * create_app + * + * @param string $client_name + * @param array $scopes read / write / follow + * @param string $redirect_uris + * @param string $website + * + * @return array $response + * int $response['id'] + * string $response['redirect_uri'] + * string $response['client_id'] + * string $response['client_secret'] + */ + public function create_app ($client_name,$scopes = array(),$redirect_uris = '',$website = '') { + $parameters = array(); + + if (count($scopes) == 0) { + if (count($this->scopes) == 0) { + $scopes = array('read','write','follow'); + } else { + $scopes = $this->scopes; + } + } + + $parameters['client_name'] = $client_name; + $parameters['scopes'] = implode(' ',$scopes); + + if (empty($redirect_uris)) { + $parameters['redirect_uris'] = 'urn:ietf:wg:oauth:2.0:oob'; + } else { + $parameters['redirect_uris'] = $redirect_uris; + } + + if ($website) { + $parameters['website'] = $website; + } + + $response = $this->_post('/api/v1/apps',$parameters); + + if (isset($response['html']['client_id'])) { + $this->client_id = $response['html']['client_id']; + $this->client_secret = $response['html']['client_secret']; + } + + return $response; + } + + /** + * login + * + * @param string $id E-mail Address + * @param string $password Password + * + * @return array $response + * string $response['access_token'] + * string $response['token_type'] bearer + * string $response['scope'] read + * int $response['created_at'] time + */ + public function login ($id,$password) { + $parameters = array(); + $parameters['client_id'] = $this->client_id; + $parameters['client_secret'] = $this->client_secret; + $parameters['grant_type'] = 'password'; + $parameters['username'] = $id; + $parameters['password'] = $password; + + if (count($this->scopes) == 0) { + $parameters['scope'] = implode(' ',array('read','write','follow')); + } else { + $parameters['scope'] = implode(' ',$this->scopes); + } + + $response = $this->_post('/oauth/token',$parameters); + + if (isset($response['html']["access_token"])) { + $this->token['access_token'] = $response['html']['access_token']; + $this->token['token_type'] = $response['html']['token_type']; + } + + return $response; + } + + public function get_access_token ($redirect_uri,$code) { + $parameters = array(); + $parameters['grant_type'] = 'authorization_code'; + $parameters['redirect_uri'] = $redirect_uri; + $parameters['client_id'] = $this->client_id; + $parameters['client_secret'] = $this->client_secret; + $parameters['code'] = $code; + $response = $this->_post('/oauth/token',$parameters); + + if (isset($response['html']["access_token"])) { + $this->token['access_token'] = $response['html']['access_token']; + $this->token['token_type'] = $response['html']['token_type']; + } + + return $response; + } + + /** + * accounts + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + * int $response['id'] + * string $response['username'] + * string $response['acct'] + * string $response['display_name'] The name to display in the user's profile + * bool $response['locked'] + * string $response['created_at'] + * int $response['followers_count'] + * int $response['following_count'] + * int $response['statuses_count'] + * string $response['note'] A new biography for the user + * string $response['url'] + * string $response['avatar'] A base64 encoded image to display as the user's avatar + * string $response['avatar_static'] + * string $response['header'] A base64 encoded image to display as the user's header image + * string $response['header_static'] + */ + public function accounts ($id) { + $response = $this->_get('/api/v1/accounts/'.$id); + return $response; + } + + /** + * accounts_verify_credentials + * + * Getting the current user + * + * @return array $response + */ + public function accounts_verify_credentials () { + $response = $this->_get('/api/v1/accounts/verify_credentials'); + return $response; + } + + /** + * accounts_update_credentials + * + * Updating the current user + * + * @param array $parameters + * string $parameters['display_name'] The name to display in the user's profile + * string $parameters['note'] A new biography for the user + * string $parameters['avatar'] A base64 encoded image to display as the user's avatar + * string $parameters['header'] A base64 encoded image to display as the user's header image + * + * @return array $response + */ + public function accounts_update_credentials ($parameters) { + $response = $this->_patch('/api/v1/accounts/update_credentials',$parameters); + return $response; + } + + /** + * accounts_followers + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_followers ($id) { + $response = $this->_get('/api/v1/accounts/'.$id.'/followers'); + return $response; + } + + /** + * accounts_following + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_following ($id) { + $response = $this->_get('/api/v1/accounts/'.$id.'/following'); + return $response; + } + + /** + * accounts_statuses + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_statuses ($id) { + $response = $this->_get('/api/v1/accounts/'.$id.'/statuses'); + return $response; + } + + /** + * accounts_follow + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_follow ($id) { + $response = $this->_post('/api/v1/accounts/'.$id.'/follow'); + return $response; + } + + /** + * accounts_unfollow + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_unfollow ($id) { + $response = $this->_post('/api/v1/accounts/'.$id.'/unfollow'); + return $response; + } + + /** + * accounts_block + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_block ($id) { + $response = $this->_post('/api/v1/accounts/'.$id.'/block'); + return $response; + } + + /** + * accounts_unblock + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_unblock ($id) { + $response = $this->_post('/api/v1/accounts/'.$id.'/unblock'); + return $response; + } + + /** + * accounts_mute + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_mute ($id) { + $response = $this->_post('/api/v1/accounts/'.$id.'/mute'); + return $response; + } + + /** + * accounts_unmute + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function accounts_unmute ($id) { + $response = $this->_post('/api/v1/accounts/'.$id.'/unmute'); + return $response; + } + + /** + * accounts_relationships + * + * @see https://your-domain/web/accounts/:id + * + * @param array $parameters + * int $parameters['id'] + * + * @return array $response + * int $response['id'] + * bool $response['following'] + * bool $response['followed_by'] + * bool $response['blocking'] + * bool $response['muting'] + * bool $response['requested'] + */ + public function accounts_relationships ($parameters) { + $response = $this->_get('/api/v1/accounts/relationships',$parameters); + return $response; + } + + /** + * accounts_search + * + * @param array $parameters + * string $parameters['q'] + * int $parameters['limit'] default : 40 + * + * @return array $response + */ + public function accounts_search ($parameters) { + $response = $this->_get('/api/v1/accounts/search',$parameters); + return $response; + } + + /** + * blocks + * + * @return array $response + */ + public function blocks () { + $response = $this->_get('/api/v1/blocks'); + return $response; + } + + /** + * favourites + * + * @return array $response + */ + public function favourites () { + $response = $this->_get('/api/v1/favourites'); + return $response; + } + + /** + * follow_requests + * + * @return array $response + */ + public function follow_requests () { + $response = $this->_get('/api/v1/follow_requests'); + return $response; + } + + /** + * follow_requests_authorize + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * + * @return array $response + */ + public function follow_requests_authorize ($id) { + $response = $this->_post('/api/v1/follow_requests/authorize',array('id'=>$id)); + return $response; + } + + /** + * follow_requests_reject + * + * @see https://your-domain/web/accounts/:id + * + * @param int $id + * @return array $response + */ + public function follow_requests_reject ($id) { + $response = $this->_post('/api/v1/follow_requests/reject',array('id'=>$id)); + return $response; + } + + /** + * follows + * + * Following a remote user + * + * @param string $uri username@domain of the person you want to follow + * @return array $response + */ + public function follows ($uri) { + $response = $this->_post('/api/v1/follows',array('uri'=>$uri)); + return $response; + } + + /** + * instance + * + * Getting instance information + * + * @return array $response + * string $response['uri'] + * string $response['title'] + * string $response['description'] + * string $response['email'] + */ + public function instance () { + $response = $this->_get('/api/v1/instance'); + return $response; + } + + /** + * media + * + * Uploading a media attachment + * + * @param string $file_path local path / http path + * + * @return array $response + * int $response['id'] ID of the attachment + * string $response['type'] One of: "image", "video", "gifv" + * string $response['url'] URL of the locally hosted version of the image + * string $response['remote_url'] For remote images, the remote URL of the original image + * string $response['preview_url'] URL of the preview image + * string $response['text_url'] Shorter URL for the image, for insertion into text (only present on local images) + */ + public function media ($file_path) { + $url = $this->mastodon_url.'/api/v1/media'; + $parameters = $data = array(); + $parameters[CURLOPT_HTTPHEADER] = array('Content-Type'=>'multipart/form-data'); + $parameters[CURLOPT_POST] = true; + + // set access_token + if (isset($this->token['access_token'])) { + $parameters[CURLOPT_POSTFIELDS]['access_token'] = $this->token['access_token']; + } + + if (is_file($file_path)) { + $mime_type = mime_content_type($file_path); + + $cf = curl_file_create($file_path,$mime_type,'file'); + $parameters[CURLOPT_POSTFIELDS]['file'] = $cf; + } + + $response = $this->get_content_curl($url,$parameters); + return $response; + } + + /** + * mutes + * + * Fetching a user's mutes + * + * @return array $response + */ + public function mutes () { + $response = $this->_get('/api/v1/mutes'); + return $response; + } + + /** + * notifications + * + * @param int $id + * + * @return array $response + */ + public function notifications ($id = 0) { + $url = '/api/v1/notifications'; + + if ($id > 0) { + $url .= '/'.$id; + } + + $response = $this->_get($url); + return $response; + } + + /** + * notifications_clear + * + * Clearing notifications + * + * @return array $response + */ + public function notifications_clear () { + $response = $this->_post('/api/v1/notifications/clear'); + return $response; + } + + /** + * get_reports + * + * Fetching a user's reports + * + * @return array $response + */ + public function get_reports () { + $response = $this->_get('/api/v1/reports'); + return $response; + } + + /** + * post_reports + * + * Reporting a user + * + * @param array $parameters + * int $parameters['account_id'] The ID of the account to report + * int $parameters['status_ids'] The IDs of statuses to report (can be an array) + * string $parameters['comment'] A comment to associate with the report. + * + * @return array $response + */ + public function post_reports ($parameters) { + $response = $this->_post('/api/v1/reports',$parameters); + return $response; + } + + /** + * search + * + * Searching for content + * + * @param array $parameters + * string $parameters['q'] The search query + * string $parameters['resolve'] Whether to resolve non-local accounts + * + * @return array $response + */ + public function search ($parameters) { + $response = $this->_get('/api/v1/search',$parameters); + return $response; + } + + /** + * statuses + * + * Fetching a status + * + * @param int $id + * + * @return array $response + */ + public function statuses ($id) { + $response = $this->_get('/api/v1/statuses/'.$id); + return $response; + } + + /** + * statuses_context + * + * Getting status context + * + * @param int $id + * + * @return array $response + */ + public function statuses_context ($id) { + $response = $this->_get('/api/v1/statuses/'.$id.'/context'); + return $response; + } + + /** + * statuses_card + * + * Getting a card associated with a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_card ($id) { + $response = $this->_get('/api/v1/statuses/'.$id.'/card'); + return $response; + } + + /** + * statuses_reblogged_by + * + * Getting who reblogged a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_reblogged_by ($id) { + $response = $this->_get('/api/v1/statuses/'.$id.'/reblogged_by'); + return $response; + } + + /** + * statuses_favourited_by + * + * Getting who favourited a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_favourited_by ($id) { + $response = $this->_get('/api/v1/statuses/'.$id.'/favourited_by'); + return $response; + } + + /** + * post_statuses + * + * @param array $parameters + * string $parameters['status'] The text of the status + * int $parameters['in_reply_to_id'] (optional): local ID of the status you want to reply to + * int $parameters['media_ids'] (optional): array of media IDs to attach to the status (maximum 4) + * string $parameters['sensitive'] (optional): set this to mark the media of the status as NSFW + * string $parameters['spoiler_text'] (optional): text to be shown as a warning before the actual content + * string $parameters['visibility'] (optional): either "direct", "private", "unlisted" or "public" + * + * @return array $response + */ + public function post_statuses ($parameters) { + $response = $this->_post('/api/v1/statuses',$parameters); + return $response; + } + + /** + * delete_statuses + * + * Deleting a status + * + * @param int $id + * + * @return array $response empty + */ + public function delete_statuses ($id) { + $response = $this->_delete('/api/v1/statuses/'.$id); + return $response; + } + + /** + * statuses_reblog + * + * Reblogging a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_reblog ($id) { + $response = $this->_post('/api/v1/statuses/'.$id.'/reblog'); + return $response; + } + + /** + * statuses_unreblog + * + * Unreblogging a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_unreblog ($id) { + $response = $this->_post('/api/v1/statuses/'.$id.'/unreblog'); + return $response; + } + + /** + * statuses_favourite + * + * Favouriting a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_favourite ($id) { + $response = $this->_post('/api/v1/statuses/'.$id.'/favourite'); + return $response; + } + + /** + * statuses_unfavourite + * + * Unfavouriting a status + * + * @param int $id + * + * @return array $response + */ + public function statuses_unfavourite ($id) { + $response = $this->_post('/api/v1/statuses/'.$id.'/unfavourite'); + return $response; + } + + /** + * timelines_home + * + * @return array $response + */ + public function timelines_home () { + $response = $this->_get('/api/v1/timelines/home'); + return $response; + } + + /** + * timelines_public + * + * @param array $parameters + * bool $parameters['local'] Only return statuses originating from this instance + * + * @return array $response + */ + public function timelines_public ($parameters = array()) { + $response = $this->_get('/api/v1/timelines/public',$parameters); + return $response; + } + + /** + * timelines_tag + * + * @param string $hashtag + * @param array $parameters + * bool $parameters['local'] Only return statuses originating from this instance + * + * @return array $response + */ + public function timelines_tag ($hashtag,$parameters = array()) { + $response = $this->_get('/api/v1/timelines/tag/'.$hashtag,$parameters); + return $response; + } + +} diff --git a/authorize/Mastodon-api-php/README.md b/authorize/Mastodon-api-php/README.md new file mode 100755 index 0000000..902b2ca --- /dev/null +++ b/authorize/Mastodon-api-php/README.md @@ -0,0 +1,19 @@ +# Mastodon-api-php +A GNU Social-compatible microblogging server https://mastodon.social PHP API + +## How to use +require_once '/path/Mastodon_api.php';
+
+$mastodon_api = new Mastodon_api();
+$mastodon_api->set_url('Mastodon url');
+
+// print_r($mastodon_api->create_app('APP Name',null,null,'Mastodon url'));
+$mastodon_api->set_client('client_id','client_secret');
+
+// print_r($mastodon_api->login('your login email','your login password'));
+$mastodon_api->set_token('access_token','token_type');
+
+$mastodon_api->timelines_home(); + +## Test Mastodon +https://ery.kr diff --git a/authorize/Mastodon.php b/authorize/Mastodon.php new file mode 100755 index 0000000..77ab619 --- /dev/null +++ b/authorize/Mastodon.php @@ -0,0 +1,82 @@ +clientName = $appSettings["App"]["api_client_name"]; + $this->clientRedirectUris = $appSettings["App"]["api_client_website"].'/auth urn:ietf:wg:oauth:2.0:oob'; + $this->clientWebsite = $appSettings["App"]["api_client_website"]; + $this->clientScopes = array('read', 'write', 'follow'); + $this->instances = array(); + + $this->dbHost = $appSettings["Mysql"]["db_host"]; + $this->dbUser = $appSettings["Mysql"]["db_user"]; + $this->dbPass = $appSettings["Mysql"]["db_pass"]; + $this->dbName = $appSettings["Mysql"]["db_name"]; + + $this->database = new Database($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName); + $this->readInstances(); + } + + /* note: $domainって書いてあるけど、ドメインじゃなくてURLです。すみません */ + + private function newInstance($domain) + { + $res = $this->create_app($this->clientName, $this->clientScopes, $this->clientRedirectUris, $this->clientWebsite); + if (isset($res['html']['client_id'])) { + $this->instances[$domain] = $res['html']; + $this->database->dbExecute("insert into instances(domain, client_id, client_secret) values(?,?,?)", array($domain, $res['html']['client_id'], $res['html']['client_secret'])); + // insert into instances(domain, client_id, client_secret) values($domain, $client_id, $client_secret) + }else{ + throw new Exception("Invalid instance"); + } + } + + public function selectInstance($domain) + { + $this->set_url($domain); + if (!$this->instanceExists($domain)) { + $this->newInstance($domain); + } + $this->set_client($this->instances[$domain]['client_id'], $this->instances[$domain]['client_secret']); + } + + public function getInstance($domain) + { + $this->set_url($domain); + if (!$this->instanceExists($domain)) { + $this->newInstance($domain); + } + return array('client_id' => $this->instances[$domain]['client_id'], 'client_secret' => $this->instances[$domain]['client_secret']); + } + + public function instanceExists($domain) + { + return isset($this->instances[$domain]); + } + + private function readInstances() + { + $stmt = $this->database->dbExecute("select domain,client_id,client_secret from instances"); + foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $row){ + $this->instances[$row['domain']] = $row; + } + } + +} +?> diff --git a/authorize/database.php b/authorize/database.php new file mode 100755 index 0000000..68c8acb --- /dev/null +++ b/authorize/database.php @@ -0,0 +1,50 @@ +dbhost = $dbhost; + $this->dbuser = $dbuser; + $this->dbpass = $dbpass; + $this->dbname = $dbname; + $this->dsn = "mysql:dbname=".$this->dbname.";host=".$this->dbhost.";charset=utf8"; + $this->connecting = false; + $this->dbConnect(); + } + + public function dbConnect($commit=True){ + try{ + $dbh = new PDO($this->dsn, $this->dbuser, $this->dbpass); + $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); + if(!$commit){ + $dbh->beginTransaction(); + } + }catch (PDOException $e){ + throw new Exception($e); + } + $this->dbh = $dbh; + $this->connecting = true; + return $dbh; + } + + public function dbClose(){ + $this->dbh = Null; + $this->connecting = false; + } + + public function dbExecute($sql, $attr = null){ + if ($attr === null) { + $attr = array(); + } + if (!$this->connecting) { + $this->dbConnect(); + } + $stmt = $this->dbh->prepare($sql); + $stmt->execute($attr); + return $stmt; + } +} +?> diff --git a/config.ini.sample b/config.ini.sample new file mode 100644 index 0000000..2661a1f --- /dev/null +++ b/config.ini.sample @@ -0,0 +1,11 @@ +; Registar App Settings +[App] +api_client_name = APPLICATION'S NAME +api_client_website = HTTPS://YOURDOMAIN.COM/ + +; MySQL Settings +[Mysql] +db_host = YOUR DATABASE'S HOST +db_user = YOUR DATABASE'S USER +db_pass = YOUR DATABASE'S PASSWORD +db_name = YOUR DATABASE'S NAME diff --git a/public_html/.htaccess b/public_html/.htaccess new file mode 100644 index 0000000..851c699 --- /dev/null +++ b/public_html/.htaccess @@ -0,0 +1,56 @@ + +RewriteEngine On + +RewriteCond %{HTTP_HOST} ^www\.(.+?)$ +RewriteRule ^(.*)$ https://$1 [R=301,L] + +RewriteCond %{SERVER_PORT} 80 +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] + +# Main +RewriteBase / +RewriteRule ^home/?$ / [R=301] + +RewriteBase /login +RewriteRule ^login/?$ login/login\.php [NC,L,QSA] +RewriteRule ^auth/?$ login/auth\.php [NC,L,QSA] +RewriteRule ^logout/?$ login/logout\.php [NC,L,QSA] +RewriteRule ^terms/?$ login/terms\.php [NC,L,QSA] + +# LTL +RewriteBase /local +RewriteRule ^local/?$ local\.php [NC,L] + +# FTL +RewriteBase /federated +RewriteRule ^federated/?$ federated\.php [NC,L] + +# Notice +RewriteBase /notifications +RewriteRule ^notifications/?$ notifications\.php [NC,L] + +# Search +RewriteBase /search +RewriteRule ^search/?$ search_hash_tag\.php [NC,L,QSA] +RewriteRule ^search/users/?$ search_user\.php [NC,L,QSA] + +# User +RewriteBase / +RewriteRule ^@(.+)@(.+)\.([a-z]+)/?$ user\.php?user=@$1@$2\.$3 [NC,L,QSA] +RewriteRule ^@(.+)@(.+)\.([a-z]+)/status/(.+?)?$ user\.php?user=@$1@$2\.$3&status=$4 [NC,L,QSA] +RewriteRule ^@(.+)@(.+)\.([a-z]+)/media/?$ user_only_media\.php?user=@$1@$2\.$3 [NC,L,QSA] +RewriteRule ^@(.+)@(.+)\.([a-z]+)/with_replies/?$ user_include_replies\.php?user=@$1@$2\.$3 [NC,L,QSA] +RewriteRule ^@(.+)@(.+)\.([a-z]+)/followers/?$ user_followers\.php?user=@$1@$2\.$3 [NC,L,QSA] +RewriteRule ^@(.+)@(.+)\.([a-z]+)/following/?$ user_following\.php?user=@$1@$2\.$3 [NC,L,QSA] +RewriteRule ^@(.+)@(.+)\.([a-z]+)/favourites/?$ user_favorite\.php?user=@$1@$2\.$3 [NC,L,QSA] + +# Image +RewriteBase / +RewriteRule ^avatars/original/missing\.png$ assets/images/missing\.png [NC,L] +RewriteRule ^headers/original/missing\.png$ assets/images/missing_header\.png [NC,L] + +# 404 +RewriteRule ^404/?$ 404\.php [NC,L,QSA] +ErrorDocument 404 /404 + + diff --git a/public_html/404.php b/public_html/404.php new file mode 100644 index 0000000..fe03c53 --- /dev/null +++ b/public_html/404.php @@ -0,0 +1,25 @@ + + + + + + + + + Halcyon / ? + + + + + + + +
+ +

404

+

Sorry, something went wrong.

+ +
+ + + \ No newline at end of file diff --git a/public_html/assets/css/404.css b/public_html/assets/css/404.css new file mode 100644 index 0000000..9a68a47 --- /dev/null +++ b/public_html/assets/css/404.css @@ -0,0 +1,169 @@ +@charset "utf-8"; + +/*-------------------------------------- + Reset +--------------------------------------*/ + +* { + margin: 0; + padding: 0; + font-size: 100%; +} + +a { + text-decoration: none; + word-break: break-all; + color: inherit; +} + +a:hover { + text-decoration: underline; +} + +ul, ol { + list-style: none; + padding: 0; + margin: 0; +} + +img { + vertical-align: top; + border: 0; + max-width: 100%; + max-height: 100%; +} + +button { + font-size: 100%; +} + +.clear { + clear: both; +} + +.red { + color: red!important; +} + +.invisible { + display: none!important; +} + +.no-events { + pointer-events: none; +} + +.disallow_select { + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.text_ellipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; + line-height: 1; + margin: 0; + padding: 0; +} + +blockquote, q { + quotes: none; + margin: 0; +} + +blockquote * { + margin: 0; + word-break: break-all; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content:''; + content:none; +} + +article,aside,details,figcaption,figure, +footer,header,hgroup,menu,nav,section { + display:block; +} + +textarea { + width: 100%; +} + +input { + max-width: 100%; +} + +button, input[type="submit"], input[type="button"]{ + background-color: transparent; + border: none; + cursor: pointer; + outline: none; + padding: 0; + appearance: none; +} + +/* Twitter Emoji Prefix */ +img.emoji { + height: 1em; + width: 1em; + margin: 0 .05em 0 .1em; + vertical-align: -0.1em; +} + +.emoji_poss .auth_emoji { + display: inline-block; + height: 100%; + margin: auto; + margin-left: 4px; +} + +/*-------------------------------------- + Base +--------------------------------------*/ + +html { + font-family : "Helvetica Neue",Helvetica,"ヒラギノ角ゴ Pro W3", + "Hiragino Kaku Gothic Pro",Meiryo,"メイリオ","MS Pゴシック",Arial,sans-serif; + font-size : 100%; + line-height : 1; + color: #333; + min-width: 100%; + min-height: 100%; +} + +body { + margin: 0; + padding: 0; + min-width: 100%; + min-height: 100%; + word-wrap:break-word; + background-color: #189EFC; +} + +article { + margin: auto; + padding: 24px; +} + +h1 { + font-size: 248px; + text-align: center; + color: #fff; + font-weight: 600; +} + +h2 { + font-size: 56px; + text-align: center; + color: #fff; + font-weight: 200; +} \ No newline at end of file diff --git a/public_html/assets/css/style.css b/public_html/assets/css/style.css new file mode 100644 index 0000000..5a03d03 --- /dev/null +++ b/public_html/assets/css/style.css @@ -0,0 +1,2894 @@ +@charset "utf-8"; + +/*-------------------------------------- + Reset +--------------------------------------*/ + +* { + margin: 0; + padding: 0; + font-size: 100%; +} + +a { + text-decoration: none; + word-break: break-all; + color: inherit; +} + +a:hover { + text-decoration: underline; +} + +ul, ol { + list-style: none; + padding: 0; + margin: 0; +} + +img { + vertical-align: top; + border: 0; + max-width: 100%; + max-height: 100%; +} + +button { + font-size: 100%; +} + +.clear { + clear: both; +} + +.red { + color: red!important; +} + +.invisible { + display: none!important; +} + +.no-events { + pointer-events: none; +} + +.disallow_select { + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.text_ellipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; + line-height: 1; + margin: 0; + padding: 0; +} + +blockquote, q { + quotes: none; + margin: 0; +} + +blockquote * { + margin: 0; + word-break: break-all; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content:''; + content:none; +} + +article,aside,details,figcaption,figure, +footer,header,hgroup,menu,nav,section { + display:block; +} + +textarea { + width: 100%; +} + +input { + max-width: 100%; +} + +button, input[type="submit"], input[type="button"]{ + background-color: transparent; + border: none; + cursor: pointer; + outline: none; + padding: 0; + appearance: none; +} + +/* Twitter Emoji Prefix */ +img.emoji { + height: 1em; + width: 1em; + margin: 0 .05em 0 .1em; + vertical-align: -0.1em; +} + +.emoji_poss .auth_emoji { + display: inline-block; + height: 100%; + margin: auto; + margin-left: 4px; +} + +/*-------------------------------------- + Base +--------------------------------------*/ + +html { + font-family : "Helvetica Neue",Helvetica,"ヒラギノ角ゴ Pro W3", + "Hiragino Kaku Gothic Pro",Meiryo,"メイリオ","MS Pゴシック",Arial,sans-serif; + font-size : 100%; + line-height : 1; + color: #333; + min-width: 100%; + min-height: 100%; +} + +body { + margin: 0; + padding: 0; + min-width: 100%; + min-height: 100%; + word-wrap:break-word; + background-color: #F5F8FA; +} + +/*-------------------------------------- + Form +--------------------------------------*/ + +.status_form { + width: 100%; + padding: 12px; + box-sizing: border-box; + background-color: #E8F4FB; +} + +/* ready to post */ +.status_form.ready { + background-color: #F2FAFF!important; +} +.status_form.ready .status_bottom .status_media_attachment, +.status_form.ready .status_bottom .status_privacy { + color: #7ECEFF!important; +} +.status_form.ready .status_bottom .status_CW > span, +.status_form.ready .status_bottom .status_NSFW > span { + background-color: #7ECEFF!important; +} +.status_form.ready .status_bottom .submit_status_label { + background-color: #A3D8FF!important; + pointer-events: none; + cursor: default; +} + +.status_form .status_top { + display: flex; + align-items: center; + width: calc( 100% - 54px ); + padding-bottom: 0; + margin-left: 54px; + box-sizing: border-box; +} + +.status_form .status_top .status_spoiler { + color: #189EFC; + width: 100%; + height: 35px; + border-radius: 4px; + border: 1px solid #C7E7FB; + font-size: 14px; + padding: 8px; + box-sizing: border-box; +} + +.status_form .status_main { + display: flex; + flex-wrap: nowrap; +} + +.status_form .status_main .icon_box { + flex-shrink: 0; + margin-right: 8px; + width: 32px; + height: 32px; + border-radius: 5px; + overflow: hidden; + margin-left: 14px; +} + +.status_form .status_main .status_textarea { + flex: 1; + padding: 8px; + border-radius: 3px; + box-sizing: border-box; + border: 1px solid #C7E7FB; + background-color: #fff; + overflow: hidden; +} + +.status_form .status_main .status_textarea textarea { + color: #189EFC; + resize: none; + height: 18px; + border: none; + max-width: 100%; + font-size: 14px; + font-family : "Helvetica Neue",Helvetica,"ヒラギノ角ゴ Pro W3", + "Hiragino Kaku Gothic Pro",Meiryo,"メイリオ","MS Pゴシック",Arial,sans-serif; + line-height: normal; +} + +.status_form .status_textarea textarea.focus { + outline: 0; + color: #000; + height: 68px; +} + +.status_form .status_textarea .media_attachments_preview_area { + display: flex; + flex-wrap: nowrap; + margin: 8px -8px -8px -8px; + padding: 8px 12px; + background-color: #F1F1F1; + border-top: 1px solid #C7E7FB; +} + +.status_form .status_textarea .media_attachments_preview { + position: relative; + flex-shrink: 0; + max-width: 113px; + height: 113px; + margin-right: 8px; + border-radius: 5px; + border: 1px solid #C7E7FB; + overflow: hidden; + flex: 1; + background-color: #fff; +} + +.status_form .status_textarea .media_attachments_preview:last-child { + margin-right: 0; +} + +.status_form .status_textarea .media_attachments_preview_area.nsfw .media_attachments_preview::after { + display: block; + content: ""; + cursor: pointer; + top: 0; + font-weight: 300; + width: 100%; + height: 100%; + position: absolute; + background-color: rgba(0, 0, 0, 1); + transition: 0.13s; +} + +.status_form .status_textarea .media_attachments_preview_area.nsfw .media_attachments_preview:hover::after { + background-color: rgba(0, 0, 0, 0); + transition: 0.13s; +} + +.status_form .status_textarea .media_attachments_preview img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.status_form .status_textarea .media_attachments_preview .remove_button { + position: absolute; + z-index: 1; + right: 0; + top: 0; + color: #fff; + background-color: rgba(0, 0, 0, .8); + border-radius: 50%; + width: 19px; + height: 19px; + display: flex; + align-content: center; + justify-content: center; + font-size: 14px; + margin: 4px 4px 0 0; +} + +.status_form .status_bottom { + display: flex; + align-items: center; + width: calc( 100% - 52px ); + padding: 8px 0; + padding-bottom: 0; + box-sizing: border-box; + padding-right: 0; + margin-left: 52px; +} + +.status_form .status_bottom .status_option_button { + cursor: pointer; + color: #43A7E5; + font-size: 21px; + border-radius: 3px; + padding: 8px 12px; + box-sizing: border-box; + border: 1px solid transparent;; + height: 39px; + display: flex; + justify-content: center; + align-items: center; +} + +.status_form .status_bottom .status_option_button:hover { + border: 1px solid #C7E7FB +} + +.status_form .status_bottom .status_option_button.active { + animation-name: status_action_active; + animation-duration: 0.5s; +} + +.status_form .status_bottom .status_CW > span, +.status_form .status_bottom .status_NSFW > span { + display: flex; + align-items: center; + height: 22px; + padding: 4px; + color: #E8F4FB; + border-radius: 3px; + box-sizing: border-box; + background-color: #43A7E5; + text-align: center; +} + +.status_form .status_bottom .status_CW > span { + font-size: 10px; +} + +.status_form .status_bottom .status_NSFW > span { + font-size: 8px; +} + + +.status_form .status_bottom .status_privacy { + position: relative; +} + +.status_form .status_bottom .status_privacy .expand_privacy_menu { + display: block; + position: absolute; + cursor: pointer; + top: 32px; + right: -122px; + width: 160px; + padding: 18px; + font-size: 12px; + border-radius: 3px; + box-sizing: border-box; + background-color: #fff; + box-shadow: 0.5px 0.5px 3px rgba(0,0,0,0.26); + z-index: 2; +} + +.status_form .status_bottom .status_privacy .expand_privacy_menu::before { + display: block; + content: ""; + z-index: -1; + width: 20px; + height: 20px; + position: absolute; + transform: rotate(45deg); + top: -5px; + left: 8px; + background-color: #fff; +} + +.status_form .status_bottom .status_privacy .expand_privacy_menu .status_privacy { + display: block; + cursor: pointer; + font-size: 14px; + margin-bottom: 12px; + color: rgb(101, 119, 134); + text-align: left; +} + +.status_form .status_bottom .status_privacy .expand_privacy_menu .status_privacy:last-child { + margin-bottom: 0; +} + +.status_form .status_bottom .status_privacy .expand_privacy_menu .status_privacy:hover { + color: #189EFC; +} + +.status_form .status_bottom .status_privacy .expand_privacy_menu .status_privacy i { + margin-right: 4px; +} + +.status_form .status_bottom .submit_status_label_wrap { + flex-grow: 1; + display: flex; + align-items: center; + justify-content: flex-end; + height: 39px; +} + +.status_form .status_bottom .character_count { + color: #66757F; + font-size: 14px; + padding: 0 12px; + box-sizing: border-box; +} + +.status_form .status_bottom .submit_status_label { + height: 100%; + padding: 6px 24px; + cursor: pointer; + float: right; + border-radius: 4px; + color: #fff; + background-color: #2588D0; + transition: 0.15s ease-out; + box-sizing: border-box; + display: flex; + justify-content: center; + align-items: center; +} + +.status_form .status_bottom .submit_status_label:hover { + background-color: #2571D0; + transition: 0.15s ease-out; +} + +.status_form .status_bottom .submit_status_label:active { + background-color: #255ED0; + transition: 0.15s ease-out; +} + +.status_form .status_bottom .submit_status_label .toot_button_label { + display: flex; + justify-content: center; + align-items: center; +} + +.status_form .status_bottom .submit_status_label .toot_button_label i { + display: inline-block; + font-size: 21px; + margin-right: 2px; +} + +.status_form .status_bottom .submit_status_label .toot_button_label span { + font-size: 13px; + font-weight: 500; +} + +/*-------------------------------------- + Status : overlay +--------------------------------------*/ + +.overlay_status{ + /*! width: 628px; */ + /*! margin: auto; */ + /*! z-index: 1000; */ + /*! top: 20%; */ + /*! left: 0; */ + /*! position: absolute; */ + /*! right: 0; */ + /*! bottom: 0; */ + margin-top: 20%; +} + +.overlay_status_header { + width: 600px; + padding: 16px; + box-sizing: border-box; + background-color: #fff; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: auto; + text-align: center; + color: #66757F; + font-size: 18px; + font-weight: 300; +} + +#overlay_status_form.status_form { + width: 600px; + padding: 16px; + box-sizing: border-box; + background-color: #E8F4FB; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + margin: auto; +} + +#overlay_status_form.status_form .status_top { + width: 100%; + margin-left: 0; +} + +#overlay_status_form.status_form .status_main { + display: flex; + flex-wrap: nowrap; +} + +#overlay_status_form.status_form .status_main .status_textarea { + flex: 1; +} + +#overlay_status_form.status_form .status_main .status_textarea textarea { + color: #000; + resize: none; + max-width: 100%; + height: auto; + min-height: 72px; + border-radius: 5px; + font-family : "Helvetica Neue",Helvetica,"ヒラギノ角ゴ Pro W3", + "Hiragino Kaku Gothic Pro",Meiryo,"メイリオ","MS Pゴシック",Arial,sans-serif; + font-size: 14px; + padding: 4px; + outline: 0; + box-sizing: border-box; +} + +#overlay_status_form.status_form .status_bottom { + display: flex; + align-items: center; + width: auto; + padding: 8px 0; + padding-bottom: 0; + margin-left: 0; + box-sizing: border-box; + padding-right: 0; +} + +/*-------------------------------------- + Status : reply +--------------------------------------*/ + +#reply_status_form.status_form:last-child { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +/*-------------------------------------- + Status : single reply +--------------------------------------*/ + +.single_reply_status { + width: 600px; + margin: auto; + /*! z-index: 1000; */ + /*! top: 25%; */ + /*! left: 0; */ + /*! height: 100%; */ + /*! position: absolute; */ + /*! right: 0; */ + /*! bottom: 0; */ + margin-top: 20%; +} + +.single_reply_status_header { + width: 600px; + padding: 16px; + box-sizing: border-box; + background-color: #fff; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: auto; + text-align: center; + color: #66757F; + font-size: 18px; + font-weight: 300; +} + +.single_reply_status .status_preview { + border-top: 1px solid #E1E8ED; +} + +.single_reply_status .status_preview .toot_entry .toot_footer { + display: none!important; +} + +.single_reply_status .status_form .status_bottom { + width: 100%; + margin-left: 0; +} + +#single_reply_status_form.status_form { + width: 600px; + padding: 16px; + box-sizing: border-box; + background-color: #E8F4FB; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + margin: auto; +} +#single_reply_status_form.status_form .status_bottom .submit_status_label .toot_button_label i { + font-size: 18px; + margin-right: 8px; +} + +/*-------------------------------------- + Status : single reply +--------------------------------------*/ + +.overlay_copy_link { + width: 600px; + margin: auto; + margin-top: 20%; +} + +.overlay_copy_link_header { + width: 600px; + padding: 16px; + box-sizing: border-box; + background-color: #fff; + border-top-left-radius: 5px; + border-top-right-radius: 5px; + margin: auto; + text-align: center; + color: #66757F; + font-size: 18px; + font-weight: 300; + border-bottom: 1px solid #E6ECF0; +} + +.overlay_copy_link .overlay_copy_link_form { + width: 600px; + padding: 16px; + box-sizing: border-box; + background-color: #fff; + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; + margin: auto; +} + +.overlay_copy_link .overlay_copy_link_form input { + width: 100%; + height: 36px; + padding: 4px 16px; + border: 1px solid #E6ECF0; + background-color: #F5F8FA; + box-sizing: border-box; + font-size: 14px; + border-radius: 3px; +} + +/*-------------------------------------- + Buttons +--------------------------------------*/ + +/* Base */ +.relationship_button { + display: flex; + flex-wrap: nowrap; + align-items: center; + font-size: 13px; + padding: 6px 13px; + margin-top: 4px; + border-radius: 4px; + border: 1px solid #189EFC; +} + +/* Base */ +.relationship_button i { + margin-right: 4px; +} + +/* Base */ +.relationship_button span { + font-weight: 600; +} + +/* Follow */ +.follow_button {border: 1px solid #189EFC; color: #189EFC;} +.follow_button i {color: #189EFC} +.follow_button:hover, +.follow_button:hover i {background-color: #189EFC;color: #fff;} + +/* Following */ +.following_button, +.following_button i {background-color: #189EFC;color: #fff;} +.following_button:hover, +.following_button:hover i {background-color: #E20055;color: #fff;} + +/* Muting */ +.muting_button {background-color: #E20055;color: #fff;} +.muting_button i {color: #fff;} +.muting_button:hover, +.muting_button:hover i {background-color: #B82424;color: #fff;} + +/* Blocking */ +.blocking_button{background-color: #fff;color: #E20055} +.blocking_button i {color: #E20055;} +.blocking_button:hover, +.blocking_button:hover i {background-color: #B82424;} + +/* IF Myself: Edit profile */ +.profile_edit_button{background-color: #FFF;color: #66757F;border: 1px solid #66757F;} +.profile_edit_button:hover, +.profile_edit_button:hover i {background-color: #F5F8FA;} + +/*-------------------------------------- + Timeline +--------------------------------------*/ + +.timeline_header { + background-color: #fff; + box-sizing: border-box; + border: 1px solid #ECF1F4; + border-bottom: none; + border-top-right-radius: 5px; + border-top-left-radius: 5px; +} + +.timeline_header .header_items { + display: flex; + flex-wrap: nowrap; + align-items: center; +} + +.timeline_header .header_items .item { + display: inline-block; + font-size: 18px; + font-weight: 300; + padding: 15px; + color: #189EFC; + box-sizing: border-box; +} + +.timeline_header .header_items .item.view { + font-weight: 600; + color: #000; +} + +/* timeline */ +.timeline { + background-color: #fff; + box-sizing: border-box; + border: 1px solid #ECF1F4; +} + +/*-------------------------------------- + Timeline Entry +--------------------------------------*/ + +/* Boost only */ +.timeline .boost_author_box { + margin-left: 46px; + margin-bottom: -12px; + padding: 8px 0; + font-size: 12px; + color: rgb(101, 119, 134); + height: 14px; +} + +/* Boost only */ +.timeline .boost_author_box i { + display: inline-block; + width: 10px; + height: 10px; + padding: 2px; + margin-right: 11px; + color: #fff; + background-color: #17BF63; + border-radius: 2px; + font-size: 10px; + /*! height: 14px; */ +} + +.toot_entry { + cursor: pointer; + background-color: #fff; + list-style: none; +} + +.toot_entry:hover { + background-color: #F5F8FA; +} + +.toot_entry .toot_entry_body { + display: flex; + flex-wrap: nowrap; + padding: 12px; + box-sizing: border-box; + border-bottom: 1px solid #ECF1F4; +} + +.toot_entry .toot_entry_body > a { + height: 48px; +} + +.toot_entry .toot_entry_body .icon_box { + flex-shrink: 0; + width: 48px; + height: 48px; + margin-right: 12px; + border-radius: 5px; + overflow: hidden; + z-index: 1; +} + +.toot_entry .toot_entry_body .icon_box img { + width: 48px; + height: 48px; +} + +.toot_entry .toot_entry_body .toot_content { + flex-grow: 1; + height: 100%; + max-width: 504px; + /*! z-index: 1; */ +} + +.toot_entry .toot_entry_body .toot_content .toot_header { + color: rgb(101, 119, 134); + position: relative; + font-size: 14px; + padding-right: 16px; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .text_ellipsis a { + line-height: 1; + height: 16.5px; + margin-bottom: -4.5px; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .displayname { + color: rgb(20, 23, 26); + font-weight: bold; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .displayname:hover { + color: #189EFC; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .right-top_button { + flex: 1; + height: 100%; +} + +/* expand button */ +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap { + position: absolute; + top: 0; + right: 0; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_button { + position: absolute; + right: 0; + top: 0; + color: #AAB8C2; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_button:hover { + color: #189EFC; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu { + display: block; + position: absolute; + cursor: pointer; + top: 36px; + right: -152px; + width: 180px; + padding: 8px 21px; + font-size: 12px; + border-radius: 3px; + box-sizing: border-box; + background-color: #fff; + box-shadow: 0.5px 0.5px 3px rgba(0,0,0,0.26); + z-index: 1; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu::before { + display: block; + content: ""; + z-index: -1; + width: 20px; + height: 20px; + position: absolute; + transform: rotate(45deg); + top: -5px; + left: 8px; + background-color: #fff; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu ul { + margin: 0 -21px; + margin-bottom: 8px; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu ul::after { + content: ""; + display: block; + margin-top: 8px; + border-bottom: 1px solid #E6ECF0; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu ul:last-child::after { + border-bottom: 0px solid #E6ECF0; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu ul li { + box-sizing: border-box; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu ul:last-child li { + margin-bottom: 0; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu a { + display: block; + padding: 8px 21px; + box-sizing: border-box; +} + +.toot_entry .toot_entry_body .toot_content .toot_header .expand_button_wrap .expand_menu a:hover { + background-color: #189EFC; + text-decoration: none; + color: #fff; +} + +.toot_entry .toot_entry_body .toot_content .cw_button { + background-color: #6D768C; + border-radius: 3px; + padding: 4px; + margin: auto 4px; + font-size: 8px; + box-sizing: border-box; + color: #fff; +} + +.toot_entry .toot_entry_body .toot_content .toot_article { + font-size: 14px; + line-height: 20px; + margin-top: 4px; +} + +.toot_entry .toot_entry_body .toot_content .toot_article a { + color: #2588D0; +} + +.toot_entry .toot_entry_body .toot_content .toot_article.content_warning .status_content { + display: none; +} + +.toot_entry .toot_entry_body .toot_content .toot_footer { + display: flex; + flex-wrap: nowrap; + align-items: center; + width: 240px; + height: 21px; + margin-top: 8px; +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction { + height: 21px; + flex-grow: 1; +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction button { + margin: auto; + color: #AAB8C2; + font-size: 18px; + height: 21px; +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction button.active { + animation-name: status_action_active; + animation-duration: 0.5s; +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction button .reaction_count { + color: #AAB8C2; + font-size: 12px; + font-weight: 600; +} + +@keyframes status_action_active { + 0% { transform: scale(1); } + 50% { transform: scale(2); } + 100% { transform: scale(1); } +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction .reply_button:hover { + color: #1DA1F2; +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="null"]:hover, +.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="true"], +.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="null"]:hover .reaction_count, +.toot_entry .toot_entry_body .toot_content .toot_reaction .boost_button[reblogged="true"] .reaction_count { + color: #17BF63; +} + +.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="null"]:hover, +.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="true"], +.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="null"]:hover .reaction_count, +.toot_entry .toot_entry_body .toot_content .toot_reaction .fav_button[favourited="true"] .reaction_count { + color: #FFAD1A; +} + +/*-------------------------------------- + Timeline Media Views +--------------------------------------*/ + +.media_views { + margin: 8px 0; + height: 336px; + width: 100%; + border-radius: 5px; + overflow: hidden; + position: relative; + box-sizing: border-box; + border: 1px solid #DCDFE1; +} + +.media_views .media_attachment { + overflow: hidden; + width: 100%; + height: 100%; +} + +.media_views .media_attachment > * { + width: 100%; + height: 100%; + object-fit: cover; +} + +.media_views .media_attachment > iframe { + object-fit: fill; +} + +.media_views.sensitive .sensitive_alart { + display: flex; + z-index: 1; + flex-direction: column; + justify-content: center; + align-items: center; + position: absolute; + width: 100%; + height: 100%; + background-color: #000; +} + +.media_views.sensitive .sensitive_alart .text1 { + font-size: 26px; + font-weight: 200; + padding: 8px 16px; + color: #fff; +} + +.media_views.sensitive .sensitive_alart .text2 { + font-weight: 200; + padding: 2px 4px; + margin-top: 3px; + color: #fff; +} + +/*---------------- + 2 +----------------*/ + +.media_views[media_length="2"] { + display: flex; +} + +.media_views[media_length="2"] .media_attachment { + flex-grow: 1; + overflow: hidden; + width: 50%; + height: 100%; +} + +.media_views[media_length="2"] .media_attachment[mediacount="0"] { + padding-right: 5px; + box-sizing: border-box; +} + +/*---------------- + 3 +----------------*/ + +.media_views[media_length="3"], +.media_views[media_length="4"] { + display: flex; +} + +.media_views[media_length="3"] .media_attachment[mediacount="0"], +.media_views[media_length="4"] .media_attachment[mediacount="0"] { + flex-grow: 2; + padding-right: 5px; + box-sizing: border-box; +} + +.media_views[media_length="3"] .media_attachments_right, +.media_views[media_length="4"] .media_attachments_right { + flex-grow: 1; + flex-shrink: 2;/* bug? */ + display: flex; + flex-direction: column; + height: 100%; +} + +.media_views[media_length="3"] .media_attachments_right .media_attachment { + padding-bottom: 5px; + box-sizing: border-box; + height: 50%; +} + +.media_views[media_length="3"] .media_attachments_right .media_attachment[mediacount="2"] { + padding-bottom: 0; +} + +/*---------------- + 4 +----------------*/ +.media_views[media_length="4"] .media_attachments_right .media_attachment { + padding-bottom: 5px; + box-sizing: border-box; + height: calc( 100% / 3 ); +} + +.media_views[media_length="4"] .media_attachments_right .media_attachment[mediacount="3"] { + padding-bottom: 0; +} + +/*-------------------------------------- + Notification +--------------------------------------*/ +.timeline .notice_entry { + padding: 10px 12px 10px 70px; + font-size: 14px; + line-height: 18px; + border-bottom: 1px solid #E6ECF0; +} + +/* boost quote */ +.timeline .notice_entry .notice_entry_body { + width: 480px; + border: 1px solid #E6ECF0; + border-radius: 5px; + padding: 8px 12px; +} + +.timeline .notice_entry .notice_entry_body .toot_header { + height: 17px; +} + +/* boost quote */ +.timeline .notice_entry .notice_entry_body .toot_article p { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.timeline .notice_entry .icon_box { + width: 24px; + height: 24px; + border-radius: 3px; + overflow: hidden; +} + +.timeline .notice_entry .icon_box img { + width: 24px; +} + +.timeline .notice_entry .font-icon { + position: relative; + padding: 3px; + left: -23px; + top: -26px; + width: 10px; + font-size: 10px; + border-radius: 3px; + color: #fff; +} + +.timeline .notice_entry .font-icon.follow { + background: #1DA1F2;; +} + +.timeline .notice_entry .font-icon.boost { + background: #17BF63; +} + +.timeline .notice_entry .font-icon.favourite { + background: #FFAD1A; +} + +.timeline .notice_entry .notice_author_box { + padding: 3px 0; +} + +.timeline .notice_entry .notice_author_box > a.notice_author { + margin-left: -18px; +} + +.timeline .notice_entry .notice_author_box > a.notice_author span { + font-weight: 600; +} + +.timeline .notice_entry .toot_content .toot_header a .displayname { + font-weight: 600; +} + +.timeline .notice_entry .toot_content .toot_header a .username { + color: #66757F; +} + +.timeline_footer { + padding: 24px; + background-color: #fff; + box-sizing: border-box; + border: 1px solid #ECF1F4; + border-top: none; + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; + color: #AAB8C2; + font-size: 36px; + text-align: center; +} + +/*-------------------------------------- + Follows profile +--------------------------------------*/ + +#js-follows_profile{ + display: flex; + width: 900px; + box-sizing: border-box; + height: auto; + flex-wrap: wrap; +} + +#js-follows_profile .follows_profile_box { + width: 290px; + margin: 0 5px; + margin-bottom: 10px; + box-sizing: border-box; + border-radius: 5px; + background-color: #fff; + overflow: hidden; + border: 1px solid #E6ECF0; +} + +#js-follows_profile .follows_profile_box .follows_profile_header { + height: 96px; + overflow: hidden; + background-color: #189EFC; +} + +#js-follows_profile .follows_profile_box .follows_profile_header img { + width: 100%; + height: 100%; + object-fit: cover; +} + +#js-follows_profile .follows_profile_box .follows_profile { + position: relative; +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_icon { + position: absolute; + width: 74px; + height: 74px; + padding: 3px; + margin-left: 16px; + border-radius: 8px; + top: -76px; + background-color: #fff; +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_icon img { + border-radius: 5px; +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_name_box { + width: auto; + /*! margin-left: 15px; */ + padding-bottom: 2px; + padding-top: 4px; + margin: 0 16px; + margin-top: 36px; +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_name_box h2 { + font-weight: 700; + font-size: 18px; + line-height: 25px; +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_name_box span { + display: block; + width: 180px; + color: #657786; + font-size: 14px; + /*! overflow: hidden; */ + white-space: nowrap; + text-overflow: ellipsis; + margin: 4px 0; +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_name_box span::before { +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_bio { + height: 58px; + font-size: 14px; + font-weight: 400; + color: #66757f; + margin: 0 16px; + margin-bottom: 0px; + margin-bottom: 16px; + line-height: 1.3; + overflow: hidden; + /*! width: 100%; */ +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_bio p { + /*! white-space: nowrap; */ + overflow: hidden; + word-break: break-all; + height: auto; + /*! max-width: 100%; */ +} + +#js-follows_profile .follows_profile_box .follows_profile .follows_profile_bio p a { + color: #189EFC +} + +#js-follows_profile .follow_button { + display: flex; + flex-wrap: nowrap; + align-items: center; + font-size: 13px; + padding: 6px 18px; + margin-top: 4px; + border-radius: 4px; + border: 1px solid #189EFC; + position: absolute; + right: 16px; + top: -32px; +} + +#js-follows_profile .follow_button i { + color: #189EFC; + margin-right: 4px; +} + +#js-follows_profile .follow_button span { + font-weight: 600; +} + +#js-follows_profile .follow_button:hover, +#js-follows_profile .follow_button:hover i { + background-color: #189EFC; + color: #fff!important; +} + +#js-follows_profile .following_button { + display: flex; + flex-wrap: nowrap; + align-items: center; + font-size: 13px; + padding: 6px 18px; + margin-top: 4px; + border-radius: 4px; + border: 1px solid #2B94DA; + background-color: #189EFC; + position: absolute; + right: 16px; + top: -32px; +} + +#js-follows_profile .following_button i { + color: #fff; + margin-right: 4px; +} + +#js-follows_profile .following_button span { + font-weight: 600; + color: #fff; +} + +#js-follows_profile .following_button:hover, +#js-follows_profile .following_button:hover i { + background-color: #E20055; + color: #fff!important; +} + +#js-follows_footer { + color: #66757F; + font-size: 36px; + text-align: center; + padding: 16px; +} + +/*-------------------------------------- + Stream +--------------------------------------*/ +#js-stream_update { + height: 0; + padding: 0px; + box-sizing: border-box; + text-align: center; + font-size: 13px; + background-color: #F5F8FA; + overflow: hidden; + transition: 0.3s; + cursor: pointer; +} + +#js-stream_update:hover { + background-color: #E6ECF0; +} + +#js-stream_update button { + color: #189EFC; +} + +/*-------------------------------------- + Current profile +--------------------------------------*/ +.current_profile_box { + margin-bottom: 10px; + border-radius: 5px; + background-color: #fff; + overflow: hidden; + border: 1px solid #E6ECF0; +} + +.current_profile_box .current_profile_header { + height: 96px; + overflow: hidden; + background-color: #189EFC; +} + +.current_profile_box .current_profile_header img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.current_profile_box .current_profile { + position: relative; +} + +.current_profile_box .current_profile .current_profile_icon { + position: absolute; + width: 70px; + height: 70px; + padding: 3px; + margin-left: 8px; + border-radius: 8px; + top: -30px; + background-color: #fff; +} + +.current_profile_box .current_profile .current_profile_icon img { + border-radius: 5px; +} + +.current_profile_box .current_profile .current_profile_name_box { + width: 180px; + margin-left: 90px; + padding-bottom: 10px; + padding-top: 8px; +} + +.current_profile_box .current_profile .current_profile_name_box h2 { + font-weight: 700; + font-size: 18px; + line-height: 25px; +} + +.current_profile_box .current_profile .current_profile_name_box span { + display: block; + width: 180px; + color: #657786; + font-size: 14px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.current_profile_box .current_profile .current_profile_name_box span::before { + content: "@"; +} + +.current_profile_box .current_profile .current_profile_counts { + display: flex; +} + +.current_profile_box .current_profile .current_profile_counts .current_profile_count { + flex-grow: 1; + padding-left: 16px; + padding-bottom: 8px; +} + +.current_profile_box .current_profile .current_profile_counts .current_profile_count a { + display: flex; + flex-direction: column; + justify-content: space-around; + text-decoration: none; +} + +.current_profile_box .current_profile .current_profile_counts .current_profile_count a .title { + color: #657786; + font-size: 10px; +} + +.current_profile_box .current_profile .current_profile_counts .current_profile_count a:hover .title { + color: #189EFC; +} + +.current_profile_box .current_profile .current_profile_counts .current_profile_count a .count { + font-size: 18px; + font-weight: 400; + padding-top: 3px; + color: #189EFC; +} + +/*-------------------------------------- + Widgets +--------------------------------------*/ + +.side_widget { + padding: 15px; + margin-bottom: 8px; + border-radius: 5px; + background-color: #fff; + border: 1px solid #E6ECF0; +} + +.side_widgets_footer { + color: rgb(101, 119, 134); + font-size: 12px; + padding: 16px 8px; +} + +.side_widgets_footer ul li { + display: inline-block; + margin: 0 12px 8px 0; +} + +.side_widget h2 { + color: #66757F; + font-size: 18px; + font-weight: 300; + margin-bottom: 15px; +} + +.side_widget h3 { + color: #66757F; + font-size: 16px; + font-weight: 300; +} + +.side_widget.stream_options .form_title{ + display: flex; + align-items: baseline; +} + +.side_widget.stream_options .form_title h2 { + margin-bottom: 0; + flex-grow: 1; +} + +.side_widget.stream_options .form_title button { + cursor: pointer; + flex-grow: 1; + font-size: 12px; + color: #189EFC; + text-align: right; +} + +.side_widget form.pulldown_form { + overflow: hidden; + height: 0; + opacity: 0; + margin-top: 0px; + transition: 0.13s ease-out; +} + +.side_widget form.pulldown_form.view { + height: 240px; + opacity: 1; + margin-top: 16px; + transition: 0.13s ease-out; +} + +.side_widget select, .side_widget input { + margin: 8px 0 16px; + width: 100%; + font-size: 14px; + color: #66757F; + box-sizing: border-box; +} + +.side_widget .account_box { + display: flex; + flex-wrap: nowrap; + align-items: center; + height: 100%; + margin-bottom: 12px; +} + +.side_widget .account_box .icon_box { + width: 48px; + height: 48px; + overflow: hidden; + margin-right: 8px; + border-radius: 5px; +} + +.side_widget .account_box .label_box { + width: 200px; +} + +.side_widget .account_box .label_box h3 { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: #333; +} + +.side_widget .account_box .label_box h3 .dn { + font-size: 14px; + font-weight: 700; +} + +.side_widget .account_box .label_box h3 .un { + font-size: 14px; + color: #66757F; +} + +.side_widget .account_box .label_box .follow_button { + display: flex; + flex-wrap: nowrap; + align-items: center; + font-size: 12px; + padding: 5px 16px; + margin-top: 4px; + border-radius: 4px; +} + +.side_widget .account_box .label_box .follow_button i { + color: #189EFC; + margin-right: 4px; +} + +.side_widget .account_box .label_box .follow_button span { + font-weight: 600; +} + +.side_widget .account_box .label_box .follow_button:hover, +.side_widget .account_box .label_box .follow_button:hover i { + background-color: #189EFC; + color: #fff!important; +} + +.side_widget .account_box .label_box .following_button { + display: flex; + color: #fff; + flex-wrap: nowrap; + align-items: center; + font-size: 12px; + padding: 5px 18px; + margin-top: 4px; + border-radius: 4px; + background-color: #189EFC; + border: 1px solid #189EFC; +} + +.side_widget .account_box .label_box .following_button:hover { + background-color: #E20055; +} + +.side_widget .account_box .label_box .following_button i { + color: #FFF; + margin-right: 4px; +} + +.side_widget .account_box .label_box .following_button span { + font-weight: 600; +} + +/*-------------------------------------- + Header +--------------------------------------*/ + +/* header */ +#header { + display: flex; + position: fixed; + z-index: 999; + width: 100%; + height: 47px; + color: #66757F; + background-color: #fff; + box-shadow: 0 1px 1px rgba(0,0,0,0.26); +} + +/* header child nav */ +#header .header_nav_wrap { + box-sizing: border-box; + display: flex; + width: 1190px; + height: 100%; + margin: auto; + padding: 0 5px; +} + +/*-------------------------------------- + Header Left +--------------------------------------*/ + +/* header nav left */ +#header .header_nav_wrap .header_left_box { + display: flex; + justify-content: flex-start; + flex: 2; + height: 100%; +} + +/* Left navigation box */ +#header .header_nav_wrap .header_left_box ul.header_nav_list { + display: flex; + width: 100%; + height: 100%; +} + +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item { + display: flex; + align-items: center; + height: 100%; + position: relative; +} + +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item .nav_badge { + width: 6px; + height: 6px; + background-color: #1B95E0; + border-radius: 50%; + position: absolute; + left: 6px; + top: 8px; +} + +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item .nav_badge.notification_badge { + position: absolute; + background-color: #189EFC; + border-radius: 40%; + font-size: 10px; + top: 8px; + left: 20px; + border: 2px solid #fff; + color: #fff; + padding: 2px; + box-sizing: border-box; + height: 20px; + width: 20px; + display: flex; + align-items: center; + justify-content: center; +} + +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a { + display: flex; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + color: #66757F; + box-sizing: border-box; + padding-right: 18px; + padding-left: 9px; + /* HACK: */ + border-top: 0px solid transparent; + border-bottom: 0px solid #189EFC; + transition: 0.15s ease-out; +} + +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a:hover { + color: #189EFC; + text-decoration: none; + border-top: 5px solid transparent; + border-bottom: 5px solid #189EFC; + transition: 0.15s ease-out; +} + +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a.view { + text-decoration: none; + border-top: 5px solid transparent; + border-bottom: 5px solid #189EFC; + transition: 0.15s ease-out; + position: relative; +} + +/* left nav icon and text */ +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a > i, +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a > span { + display: inline-block; + text-align: center; +} + +/* left nav icon */ +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a > i { + margin-right: 4px; + font-size: 21px; +} + +/* left nav text */ +#header .header_nav_wrap .header_left_box ul.header_nav_list li.header_nav_item a > span { + font-size: 13px; + font-weight: 400; +} + +/*-------------------------------------- + Header Center +--------------------------------------*/ + +/* header nav center */ +#header .header_nav_wrap .header_center_box { + display: flex; + flex: 1.2; + height: 100%; + box-sizing: border-box; + padding: 8px 0; + align-items: center; + justify-content: center; +} + +/* mastodon logo */ +#header .logo_box { + height: 96%; + padding: 4px; + box-sizing: border-box; +} + +/* mastodon logo */ +#header .logo_box img { + width: auto; + display: block; +} + +/*-------------------------------------- + Header Right +--------------------------------------*/ + +/* header nav right*/ +#header .header_nav_wrap .header_right_box { + flex: 2; + box-sizing: border-box; + padding: 8px 0; + height: 100%; +} + +/* header nav right list */ +#header .header_nav_wrap .header_right_box ul.header_nav_list { + display: flex; + justify-content: flex-end; + align-items: center; + width: 100%; + height: 100%; +} + +#header .header_nav_wrap .header_right_box ul.header_nav_list li.header_nav_item { + display: flex; + height: 100%; + justify-content: center; + align-items: center; + padding-right: 16px; +} + +/* Search box */ +#header .header_nav_wrap .header_right_box .search_form { + width: 221px; + height: 95%; + outline: 0; + position: relative; +} + +#header .header_nav_wrap .header_right_box .search_form .search_form_input { + box-sizing: border-box; + padding: 5px 12px; + font-size: 12px; + width: 100%; + border-radius: 16px; + border: 1px solid #E8EEF1; + background-color: #F5F8FA; + height: 100%; + transition: 0.15s ease-out;; +} + +#header .header_nav_wrap .header_right_box .search_form .search_form_input:focus { + background-color: transparent; + transition: 0.15s ease-out;; +} + +#header .header_nav_wrap .header_right_box .search_form .search_form_submit { + display: block; + position: absolute; + height: 14px; + font-size: 14px; + top: 5px; + right: 12px; + margin: 2px -4px; +} + +#header .header_nav_wrap .header_right_box .search_form .search_form_submit button, +#header .header_nav_wrap .header_right_box .search_form .search_form_submit i { + display: block; + color: #66757F; +} + +/* Account display */ +#header .header_nav_wrap .header_right_box .my_account_wrap { + position: relative; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .my_account { + height: 35px; + width: 35px; + margin: auto; + display: flex; + justify-content: center; + align-items: center; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .my_account img { + width: 32px; + height: 32px; + overflow: hidden; + border-radius: 50%; + transition: 0.15s ease-out; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav { + display: block; + position: absolute; + cursor: pointer; + top: 42px; + right: 14px; + width: 180px; + padding: 8px 21px; + font-size: 12px; + border-radius: 3px; + box-sizing: border-box; + background-color: #fff; + box-shadow: 0.5px 0.5px 3px rgba(0,0,0,0.26); +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav::before { + display: block; + content: ""; + z-index: -1; + width: 20px; + height: 20px; + position: absolute; + transform: rotate(45deg); + top: -5px; + right: 8px; + background-color: #fff; + border: 0.5px solid rgba(0,0,0,.26); +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav ul { + margin: 0 -21px; + margin-bottom: 8px; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav ul::after { + content: ""; + display: block; + margin-top: 8px; + border-bottom: 1px solid #E6ECF0; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav ul:last-child::after { + border-bottom: 0px solid #E6ECF0; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav ul li { + box-sizing: border-box; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav ul li a .display_name { + display: block; + color: #000; + font-size: 14px; + font-weight: 600; + margin-bottom: 4px; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav a { + display: block; + padding: 8px 21px; +} + +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav a:hover, +#header .header_nav_wrap .header_right_box .my_account_wrap .header_my_account_nav ul li a:hover .display_name { + background-color: #189EFC; + text-decoration: none; + color: #fff; +} + +/* toot button */ +#header .header_nav_wrap .header_right_box .toot_button { + width: 90px; + height: 100%; + border-radius: 4px; + color: #fff; + background-color: #2588D0; + transition: 0.15s ease-out;; +} + +#header .header_nav_wrap .header_right_box .toot_button:hover { + background-color: #2571D0; + transition: 0.15s ease-out;; +} + +#header .header_nav_wrap .header_right_box .toot_button:active { + background-color: #255ED0; + transition: 0.15s ease-out;; +} + +#header .header_nav_wrap .header_right_box .toot_button .toot_button_label { + display: flex; + justify-content: center; + align-items: center; +} + +#header .header_nav_wrap .header_right_box .toot_button i { + display: inline-block; + font-size: 21px; + margin-right: 2px; +} + +#header .header_nav_wrap .header_right_box .toot_button span { + font-size: 13px; + font-weight: 500; +} + +/*-------------------------------------- + Main +--------------------------------------*/ + +#main { + padding-top: 47px; +} + +/*-------------------------------------- + Profile +--------------------------------------*/ + +#main > .header_image_box { + width: 100%; + height: 460px; + overflow: hidden; +} + +#main > .header_image_box img { + min-width: 100%; + object-fit: cover; +} + +#main .profile_nav_wrap { + height: 60px; + width: 100%; + background-color: #fff; + box-shadow: 0 1px 3px 0 rgba(0,0,0,0.25); +} + +#main .profile_nav_wrap .profile_nav { + display: flex; + flex-wrap: nowrap; + width: 1200px; + height: 100%; + margin: auto; + padding: 0 5px; + box-sizing: border-box; +} + +/*-------------------------------------- + Profile nav Left +--------------------------------------*/ + +#main .profile_nav_wrap .profile_nav .profile_nav_left { + width: 300px; + height: 100%; +} + +/*-------------------------------------- + Profile nav Right +--------------------------------------*/ + +#main .profile_nav_wrap .profile_nav .profile_nav_right { + width: 900px; + height: 100%; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list { + display: flex; + flex-wrap: nowrap; + align-items: center; + height: 100%; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item { + height: 100%; + color: #66757F; + border-color: transparent; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item a { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + justify-content: center; + height: 100%; + padding: 0 15px; + box-sizing: border-box; + border-top: 0px solid transparent; + border-bottom: 0px solid #189EFC; + transition: 0.15s; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item:hover { + color: #189EFC; + box-sizing: border-box; + text-decoration: none; + border-top: 4px solid transparent; + border-bottom: 4px solid #189EFC; + transition: 0.15s; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item.view { + color: #189EFC; + box-sizing: border-box; + border-top: 4px solid transparent; + border-bottom: 4px solid #189EFC; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item a:hover { + text-decoration: none; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item a h2 { + display: inline-block; + font-size: 11px; + font-weight: normal; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_nav_item a span { + display: inline-block; + font-size: 18px; + font-weight: 600; + margin-top: 3px; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_button_box { + display: flex; + align-items: center; + justify-content: flex-end; + flex: 1; + height: 100%; +} + +#main .profile_nav_wrap .profile_nav .profile_nav_right .profile_nav_list .profile_button_box button { + float: right; + padding: 9px 16px; + border-radius: 4px; + font-size: 14px; + font-weight: 700; +} + +/*-------------------------------------- + Search +--------------------------------------*/ + +#js-search_title_box { + width: 100%; + height: 64px; + padding: 16px 0; + overflow: hidden; + box-sizing: border-box; + background-color: #189EFC; +} + +#js-search_title_box h1 { + display: block; + width: 1200px; + margin: 0 auto; + padding: 0 16px; + font-size: 27px; + font-weight: 400; + line-height: 32px; + color: #fff; + box-sizing: border-box; +} + +#main .search_nav_wrap { + height: 50px; + width: 100%; + background-color: #fff; + box-shadow: 0 1px 3px 0 rgba(0,0,0,0.25); + margin-bottom: 4px; +} + +#main .search_nav_wrap .search_nav { + display: flex; + flex-wrap: nowrap; + width: 1200px; + height: 100%; + margin: auto; + padding: 0 5px; + box-sizing: border-box; +} + +#main .search_nav_wrap .search_nav .search_nav_left { + width: 900px; + height: 100%; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list { + display: flex; + flex-wrap: nowrap; + align-items: center; + height: 100%; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item { + height: 100%; + color: #66757F; + /*! font-size: 13px; */ +} + +#main .search_nav_wrap #js-search_nav_peoples.view a , +#main .search_nav_wrap #js-search_nav_toots.view a { + border-top: 4px solid transparent; + border-bottom: 4px solid #189EFC; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + align-items: center; + justify-content: center; + height: 100%; + padding: 0 15px; + box-sizing: border-box; + border-top: 0px solid transparent; + border-bottom: 0px solid #189EFC; + transition: 0.15s; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a:hover { + color: #189EFC; + text-decoration: none; + border-top: 4px solid transparent; + border-bottom: 4px solid #189EFC; + transition: 0.15s; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a.view { + color: #189EFC; + border-top: 4px solid transparent; + border-bottom: 4px solid #189EFC; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a h2 { + display: inline-block; + font-size: 14px; + font-weight: normal; + color: #189EFC; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_nav_item a span { + display: inline-block; + font-size: 18px; + font-weight: 600; + margin-top: 3px; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_button_box { + display: flex; + align-items: center; + justify-content: flex-end; + flex: 1; + height: 100%; +} + +#main .search_nav_wrap .search_nav .search_nav_left .search_nav_list .search_button_box button { + float: right; + padding: 9px 16px; + border-radius: 4px; + font-size: 14px; + font-weight: 700; +} + +/*-------------------------------------- + Article +--------------------------------------*/ + +#main .article_wrap { + display: flex; + flex-wrap: nowrap; + width: 1200px; + margin: auto; +} + +/*-------------------------------------- + Article section column +--------------------------------------*/ + +#main .article_wrap .left_column { + position: relative; + width: 300px; + padding: 10px 5px; + box-sizing: border-box; +} + +#main .article_wrap .left_column > .profile_icon_box { + position: absolute; + top: -185px; + width: 200px; + height: 200px; + margin-left: 10px; + padding: 5px; + background-color: #fff; + border-radius: 14px; + border: 1px solid #FBFBFC; + box-shadow: 0 0.1px 0.3px rgba(0,0,0,0.26); + cursor: pointer; +} + +#main .article_wrap .left_column .profile_icon_box img { + width: 100%; + height: 100%; + border-radius: 8px; +} + +#main .article_wrap .left_column .profile_section_wrap { + padding: 36px 16px 0 15px; + word-break: break-all; +} + +#main .article_wrap .left_column .profile_section_wrap > .profile_displayname { + font-size: 22px; + font-weight: 700; + line-height: 1; + color: rgb(20, 23, 26); + margin-bottom: 8px; +} + +#main .article_wrap .left_column .profile_section_wrap > .profile_username { + color: rgb(101, 119, 134); + font-size: 14px; + font-weight: 300; + margin-bottom: 8px; +} + +#main .article_wrap .left_column .profile_section_wrap > .profile_username .profile_followed_by { + font-size: 10px; + display: inline-block; + margin-left: 8px; +} + +#main .article_wrap .left_column .profile_section_wrap > .profile_bio { + font-size: 14px; + font-weight: 400; + line-height: 20px; + margin-bottom: 10px; + word-wrap: break-word; +} + +#main .article_wrap .left_column .profile_section_wrap > .profile_bio a { + color: #2588D0; +} + +#js_profile_recent_images a { + color: #2588D0; + font-size: 13px; + font-weight: 300; +} + +#js_profile_recent_images a i { + color: #657786; + margin-right: 8px; + font-size: 16px; +} + +#js_profile_recent_images_box { + width: 100%; + font-size: 14px; + display: flex; + margin-top: 8px; + flex-wrap: wrap; +} + +#js_profile_recent_images_box .profile_recent_images_item { + width: 80px; + height: 80px; + margin: 0 5px 5px 0; + border-radius: 5px; + overflow: hidden; + flex-shrink: 0; + cursor: pointer; +} + +#js_profile_recent_images_box .profile_recent_images_item img { + width: 100%; + height: 100%; + max-width: none; + max-height: none; + object-fit: cover; +} + +/*-------------------------------------- + Article post column +--------------------------------------*/ + +#main .article_wrap .center_column { + width: auto; + flex: 1; + /* If disappearing .right_column(300px), + Then this box will fill the rest spaces */ + padding: 10px 5px; + box-sizing: border-box; +} + +/*-------------------------------------- + Article side column +--------------------------------------*/ + +#main .article_wrap .right_column { + width: 300px; + padding: 10px 5px; + box-sizing: border-box; +} + +/*------------------------------------- + Overlay content +-------------------------------------*/ + +#js-overlay_content_wrap { + display: none; + position: fixed; + z-index: 1000; + top: 0; + left: 0; + width: 100%; + height: 100%; + overflow: scroll; +} + +#js-overlay_content_wrap.view { + display: block; + background-color: rgba(0, 0, 0, 0); + transition: 0.5s; +} + +@keyframes fadein_05 { + 0% { background-color: rgba(0, 0, 0, 0); } + 100% {background-color: rgba(0, 0, 0, 0.5);} +} + +@keyframes fadein_08 { + 0% { background-color: rgba(0, 0, 0, 0); } + 100% {background-color: rgba(0, 0, 0, 0.8);} +} + +#js-overlay_content_wrap.view.black_05 { + animation-name: fadein_05; + animation-duration: 0.35s; + animation-fill-mode: forwards; +} + +#js-overlay_content_wrap.view.black_08 { + background-color: rgba(0, 0, 0, 0.8); +} + +#js-overlay_content_wrap #js-overlay_content { + width: 628px; + height: auto; + margin: 56px auto; + position: relative; +} + +#js-overlay_content_wrap #js-overlay_content .close_button { + color: #fff; + position: absolute; + right: -32px; + top: 0; + font-size: 28px; +} + +#js-overlay_content_wrap .temporary_object .thumb_box { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; +} + +/*----------------------------------- + Message +-----------------------------------*/ + +#overlay_message { + position: fixed; + top: -47px; + left: 0; + right: 0; + bottom: 0; + margin: 0 auto; + width: 658px; + height: 58px; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + background-color: #fff; + box-shadow: 1px 1px 3px rgba(0,0,0,0.35); + z-index: 998; +} + +@keyframes overlay_message_active { + 0% { top: -47px } + 10% { top: 47px; } + 85% { top: 47px; } + 100% { top: -47px } +} + +#overlay_message.view { + animation-name: overlay_message_active; + animation-duration: 3s; +} + +#overlay_message section { + color: #999; + font-size: 14px; + padding: 16px; + margin: auto; + display: block; + box-sizing: border-box; + height: 100%; + width: 100%; + display: flex; + justify-content: center; + align-items: center; +} + +/*----------------------------------- + Overflow status +-----------------------------------*/ + +.toot_detail_wrap { + border-radius: 5px; +} + +.toot_detail_wrap .toot_detail:first-child, +.toot_detail_wrap .toot_entry:first-child { + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +.toot_detail_wrap .toot_detail:last-child, +.toot_detail_wrap .toot_entry:last-child { + border-bottom-left-radius: 5px; + border-bottom-right-radius: 5px; +} + +.toot_detail { + width: 628px; + box-sizing: border-box; + background-color: #fff; +} + +.toot_entry.ancestors_status .toot_entry_body, +.toot_entry.descendants_status .toot_entry_body { + padding: 18px 40px; + border-bottom: none; + position: relative; + /*! padding-bottom: 8px; */ +} + +.toot_entry.ancestors_status.default_padding .toot_entry_body, +.toot_entry.descendants_status.default_padding .toot_entry_body { + padding: 12px; +} + +.toot_entry.ancestors_status .toot_entry_body::after, +.toot_entry.descendants_status .toot_entry_body::after { + content: ""; + display: block; + border: 2px solid #76BFEC; + position: absolute; + border-radius: 2px; + position: absolute; + left: 62px; + height: calc(100% - 57px); + top: 68px; +} + +.toot_entry.ancestors_status.default_padding .toot_entry_body::after, +.toot_entry.descendants_status.default_padding .toot_entry_body::after { + left: 35px; + height: calc(100% - 60px); + top: 64px; +} + +.toot_entry.descendants_status:last-child .toot_entry_body::after { + border: 0px solid #76BFEC; +} + +.toot_detail .toot_header { + display: flex; +} + +.toot_detail .toot_header .icon_box { + flex-shrink: 0; + width: 48px; + height: 48px; + border-radius: 3px; + overflow: hidden; + margin-right: 8px; +} + +.toot_detail .toot_header a { + flex-grow: 1; + display: flex; + flex-direction: column; + justify-content: center; +} + +.toot_detail .toot_header a .displayname { + color: #000; + font-size: 17px; + font-weight: 600; + line-height: 1.35; +} + +.toot_detail .toot_header a .username { + color: #66757F; + font-size: 14px; +} + +.toot_detail .toot_header a:hover { + text-decoration: none; +} + +.toot_detail .toot_header a:hover .displayname { + color: #189EFC; +} + +/* expand button */ +.toot_detail .toot_header .expand_button_wrap { + float: right; + position: relative; + width: 48px; + height: 48px; +} + +.toot_detail .toot_header .expand_button_wrap .expand_button { + position: absolute; + right: 0; + top: 0; + color: #AAB8C2; +} + +.toot_detail .toot_header .expand_button_wrap .expand_button:hover { + color: #189EFC; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu { + display: block; + position: absolute; + cursor: pointer; + top: 36px; + right: -152px; + width: 180px; + padding: 8px 21px; + font-size: 12px; + border-radius: 3px; + box-sizing: border-box; + background-color: #fff; + box-shadow: 0.5px 0.5px 3px rgba(0,0,0,0.26); + z-index: 1; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu::before { + display: block; + content: ""; + z-index: -1; + width: 20px; + height: 20px; + position: absolute; + transform: rotate(45deg); + top: -5px; + left: 8px; + background-color: #fff; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu ul { + margin: 0 -21px; + margin-bottom: 8px; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu ul::after { + content: ""; + display: block; + margin-top: 8px; + border-bottom: 1px solid #E6ECF0; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu ul:last-child::after { + border-bottom: 0px solid #E6ECF0; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu ul li { + box-sizing: border-box; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu a { + display: block; + padding: 8px 21px; +} + +.toot_detail .toot_header .expand_button_wrap .expand_menu a:hover { + background-color: #189EFC; + text-decoration: none; + color: #fff; +} + +/* main */ + +.toot_detail .toot_detail_body { + padding: 30px 40px; + /*! border-radius: 4px; */ +} + +.toot_detail .toot_content .toot_article { + font-size: 14px; + line-height: 20px; + margin: 16px auto; +} + +.toot_detail.main_status .toot_content .toot_article { + font-size: 24px; + line-height: 1.35; +} + +.toot_detail.main_status .toot_content .toot_article .cw_button { + background-color: #6D768C; + border-radius: 3px; + padding: 4px; + margin: auto 4px; + font-size: 12px; + box-sizing: border-box; + color: #fff; +} + +.toot_detail.main_status .toot_content .toot_article.content_warning .status_content { + display: none; +} + +.toot_detail.main_status .toot_content a { + color: #189EFC; +} + +.toot_detail.main_status .toot_content time { + color: #66757F; + font-size: 13px; + font-weight: 300; +} + +/* reactions */ +.toot_detail .toot_footer { + display: flex; + flex-wrap: nowrap; + align-items: center; + width: 230px; + height: 21px; + margin-top: 12px; +} + +.toot_detail .toot_footer .toot_reaction { + height: 21px; + flex-grow: 1; +} + +.toot_detail .toot_footer .toot_reaction button { + margin: auto; + color: #AAB8C2; + font-size: 18px; + height: 21px; +} + +.toot_detail .toot_footer .toot_reaction button.active { + animation-name: status_action_active; + animation-duration: 0.5s; +} + +.toot_detail .toot_footer .toot_reaction button .reaction_count { + color: #AAB8C2; + font-size: 12px; + font-weight: 600; +} + +@keyframes status_action_active { + 0% { transform: scale(1); } + 50% { transform: scale(2); } + 100% { transform: scale(1); } +} + +.toot_detail .toot_footer .toot_reaction .reply_button:hover { + color: #1DA1F2; +} + +.toot_detail .toot_footer .toot_reaction .boost_button[reblogged="false"]:hover, +.toot_detail .toot_footer .toot_reaction .boost_button[reblogged="true"], +.toot_detail .toot_footer .toot_reaction .boost_button[reblogged="false"]:hover .reaction_count, +.toot_detail .toot_footer .toot_reaction .boost_button[reblogged="true"] .reaction_count { + color: #17BF63; +} + +.toot_detail .toot_footer .toot_reaction .fav_button[favourited="false"]:hover, +.toot_detail .toot_footer .toot_reaction .fav_button[favourited="true"], +.toot_detail .toot_footer .toot_reaction .fav_button[favourited="false"]:hover .reaction_count, +.toot_detail .toot_footer .toot_reaction .fav_button[favourited="true"] .reaction_count { + color: #FFAD1A; +} + +.toot_detail .status_form { + border-top: 1px solid #E6ECF0; + border-bottom: 1px solid #E6ECF0; +} + +/*---------------------------------- + media detail +----------------------------------*/ + +.media_detail { + max-height: 100%; +} + +.media_detail .media_box { + background-color: #000; + border-top-right-radius: 5px; + border-top-left-radius: 5px; + overflow: hidden; + text-align: center; +} + +.media_detail .toot_entry { + border-bottom-right-radius: 5px; + border-bottom-left-radius: 5px; +} + +.media_detail .toot_entry .toot_entry_body { + border-bottom: none; +} + +.media_detail .toot_entry .media_views { + display: none; +} diff --git a/public_html/assets/images/elf.jpg b/public_html/assets/images/elf.jpg new file mode 100644 index 0000000..e816962 Binary files /dev/null and b/public_html/assets/images/elf.jpg differ diff --git a/public_html/assets/images/favicon.ico b/public_html/assets/images/favicon.ico new file mode 100644 index 0000000..1a47654 Binary files /dev/null and b/public_html/assets/images/favicon.ico differ diff --git a/public_html/assets/images/halcyon.png b/public_html/assets/images/halcyon.png new file mode 100644 index 0000000..63fe273 Binary files /dev/null and b/public_html/assets/images/halcyon.png differ diff --git a/public_html/assets/images/halcyon_logo.png b/public_html/assets/images/halcyon_logo.png new file mode 100644 index 0000000..4468cdf Binary files /dev/null and b/public_html/assets/images/halcyon_logo.png differ diff --git a/public_html/assets/images/halcyon_w.png b/public_html/assets/images/halcyon_w.png new file mode 100644 index 0000000..ee8bb2e Binary files /dev/null and b/public_html/assets/images/halcyon_w.png differ diff --git a/public_html/assets/images/mastodon.png b/public_html/assets/images/mastodon.png new file mode 100644 index 0000000..f0c1c46 Binary files /dev/null and b/public_html/assets/images/mastodon.png differ diff --git a/public_html/assets/images/missing.png b/public_html/assets/images/missing.png new file mode 100644 index 0000000..839a2dc Binary files /dev/null and b/public_html/assets/images/missing.png differ diff --git a/public_html/assets/images/missing_header.png b/public_html/assets/images/missing_header.png new file mode 100644 index 0000000..839a2dc Binary files /dev/null and b/public_html/assets/images/missing_header.png differ diff --git a/public_html/assets/images/self_auth.png b/public_html/assets/images/self_auth.png new file mode 100644 index 0000000..9e33e56 Binary files /dev/null and b/public_html/assets/images/self_auth.png differ diff --git a/public_html/assets/images/self_auth_min.png b/public_html/assets/images/self_auth_min.png new file mode 100644 index 0000000..6d340bf Binary files /dev/null and b/public_html/assets/images/self_auth_min.png differ diff --git a/public_html/assets/js/halcyon/halcyonFunctions.js b/public_html/assets/js/halcyon/halcyonFunctions.js new file mode 100644 index 0000000..773b054 --- /dev/null +++ b/public_html/assets/js/halcyon/halcyonFunctions.js @@ -0,0 +1,258 @@ +/*----------------------------------- + get Link from XHR Header +-----------------------------------*/ + +function getLinkFromXHRHeader(xhrheaderstring) { + const re = xhrheaderstring.match(/link: <.+api\/v1\/(.+?)>; rel="(.+?)", <.+api\/v1\/(.+?)>; rel="(.+?)"/); + let di = new Object(); + if(re){ + di[re[2]] = re[1]; + di[re[4]] = re[3]; + } + return di; +} + +/*---------------------------------- + Make relative URL +----------------------------------*/ + +function getRelativeURL(url, id, options) { + + const array = url.split('/'); + + if ( array.length >= 4 ) { + if ( !options ) { + var options = "" + }; + + if (id) { + // IF WITHIN ID + if (array[array.length-1].substr(0,1) === '@') { + const link = '/'+array[array.length-1]+'@'+array[2]+options+'?mid='+id+'&'; + return link; + } else { + const link = '/@'+array[array.length-1]+'@'+array[2]+options+'?mid='+id+'&'; + return link; + } + + } else { + // IF WITHOUT ID (URL ONLY) + if (array[array.length-1].substr(0,1) === '@') { + const link = '/'+array[array.length-1]+'@'+array[2]+options; + return link; + } else { + const link = '/@'+array[array.length-1]+'@'+array[2]+options; + return link; + } + } + + } + +} + +/*----------------------------------- + Replace Mastodon link for Halcyon +-----------------------------------*/ + +function replaceInternalLink(){ + // REPLIES + $(".h-card > a").each(function(i) { + $(this).attr('href',getRelativeURL($(this).attr('href'))); + }); + // HASHTAGS + $(".toot_article a").each(function(i) { + const tags = $(this).attr('href').match(/https:\/\/.+..+\/tags\/(.+)\/?/); + if (tags) { + $(this).attr('href','/search?q='+tags[1]); + } + }); +} + +/*----------------------------------- + Datetime exchange +-----------------------------------*/ + +function getConversionedDate(key, value) { + if (value === null || + value.constructor !== String || + value.search(/^\d{4}-\d{2}-\d{2}/g) === -1) + return value; + return new Date(value); +} + +/*---------------------------------- + Relative Datetime +----------------------------------*/ + +function getRelativeDatetime(current_time, posted_time) { + const calendar = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; + + var posted_time_original = posted_time, + posted_time = getConversionedDate(null, posted_time_original).getTime(), + elapsedTime = Math.ceil((current_time-posted_time)/1000); + + if (elapsedTime < 60) { + const datetime = "・" + elapsedTime + "s"; + return datetime; + + } else if (elapsedTime < 120) { + const datetime = "・1m"; + return datetime; + + } else if (elapsedTime < (60*60)) { + const datetime = "・" + (Math.floor(elapsedTime / 60) < 10 ? " " : "") + Math.floor(elapsedTime / 60) + "m"; + return datetime; + + } else if (elapsedTime < (120*60)) { + const datetime = "・1h"; + return datetime; + + } else if (elapsedTime < (24*60*60)) { + const datetime = "・" + (Math.floor(elapsedTime / 3600) < 10 ? " " : "") + Math.floor(elapsedTime / 3600) + "h"; + return datetime; + + } else { + const datetime = "・" + calendar[posted_time_original.getMonth()] + " " + posted_time_original.getDate(); + return datetime; + } +} + +/*----------------------------------- + ResetApp +-----------------------------------*/ + +function resetApp() { + + /* IMPORTANT */ + current_id = Number(localStorage.getItem("current_id")); + current_instance = localStorage.getItem("current_instance"); + authtoken = localStorage.getItem("current_authtoken"); + + // Start api + api = new MastodonAPI({ + instance: 'https://'+current_instance, + api_user_token: authtoken + }); + + // Set local storage items + api.get("accounts/verify_credentials", function(AccountObj) { + + // SAVE PROFILE FOR LOCALSTORAGE (ENABLE BETWEEN ONE SESSION) + localStorage.setItem("current_display_name", AccountObj["display_name"]); + localStorage.setItem("current_acct", AccountObj["acct"]); + localStorage.setItem("current_url", getRelativeURL(AccountObj["url"],AccountObj["id"])); + localStorage.setItem("current_header", AccountObj["header"]); + localStorage.setItem("current_avatar", AccountObj["avatar"]); + localStorage.setItem("current_statuses_count", AccountObj["statuses_count"]); + localStorage.setItem("current_following_count", AccountObj["following_count"]); + localStorage.setItem("current_followers_count", AccountObj["followers_count"]); + localStorage.setItem("current_statuses_count_link", getRelativeURL(AccountObj["url"],AccountObj["id"])); + localStorage.setItem("current_following_count_link", getRelativeURL(AccountObj["url"],AccountObj["id"],'/following')); + localStorage.setItem("current_followers_count_link", getRelativeURL(AccountObj["url"],AccountObj["id"],'/followers')); + localStorage.setItem("current_favourites_link", getRelativeURL(AccountObj["url"],AccountObj["id"],'/favourites')); + + // PROFILE + current_display_name = localStorage.getItem("current_display_name"); + current_acct = localStorage.getItem("current_acct"); + current_url = localStorage.getItem("current_url"); + current_header = localStorage.getItem("current_header"); + current_avatar = localStorage.getItem("current_avatar"); + current_statuses_count = localStorage.getItem("current_statuses_count"); + current_following_count = localStorage.getItem("current_following_count"); + current_followers_count = localStorage.getItem("current_followers_count"); + current_statuses_count_link = localStorage.getItem("current_statuses_count_link"); + current_following_count_link = localStorage.getItem("current_following_count_link"); + current_followers_count_link = localStorage.getItem("current_followers_count_link"); + current_favourites_link = localStorage.getItem("current_favourites_link"); + + // REPLACE USER'S INFORMATIONS + $(".js_current_profile_displayname").text(current_display_name); + $(".js_current_profile_username").text(current_acct); + $(".js_current_profile_link").attr('href', current_url); + $(".js_current_header_image").attr('src', current_header); + $(".js_current_profile_image").attr('src', current_avatar); + $(".js_current_toots_count").text(current_statuses_count); + $(".js_current_following_count").text(current_following_count); + $(".js_current_followers_count").text(current_followers_count); + $(".current_toots_count_link").attr('href', current_statuses_count_link); + $(".current_following_count_link").attr('href', current_following_count_link); + $(".current_followers_count_link").attr('href', current_followers_count_link); + + replace_emoji(); + + }); + + $.cookie("session", "true", { path: '/' }); + +} + +/*----------------------------------- + RefreshApp +-----------------------------------*/ + +function refreshApp() { + + // IMPORTANT + current_id = Number(localStorage.getItem("current_id")); + current_instance = localStorage.getItem("current_instance"); + authtoken = localStorage.getItem("current_authtoken"); + + // Start api + api = new MastodonAPI({ + instance: "https://"+current_instance, + api_user_token: authtoken + }); + + // PROFILE + current_display_name = localStorage.getItem("current_display_name"); + current_acct = localStorage.getItem("current_acct"); + current_url = localStorage.getItem("current_url"); + current_header = localStorage.getItem("current_header"); + current_avatar = localStorage.getItem("current_avatar"); + current_statuses_count = localStorage.getItem("current_statuses_count"); + current_following_count = localStorage.getItem("current_following_count"); + current_followers_count = localStorage.getItem("current_followers_count"); + current_statuses_count_link = localStorage.getItem("current_statuses_count_link"); + current_following_count_link = localStorage.getItem("current_following_count_link"); + current_followers_count_link = localStorage.getItem("current_followers_count_link"); + current_favourites_link = localStorage.getItem("current_favourites_link"); + +} + +/*----------------------------------- + Profile +-----------------------------------*/ + +function setCurrentProfile() { + + // REPLACE USER'S INFORMATIONS + $(".js_current_profile_displayname").text(current_display_name); + $(".js_current_profile_username").text(current_acct); + $(".js_current_profile_link").attr("href", current_url); + $(".js_current_header_image").attr("src", current_header); + $(".js_current_profile_image").attr("src", current_avatar); + $(".js_current_toots_count").text(current_statuses_count); + $(".js_current_following_count").text(current_following_count); + $(".js_current_followers_count").text(current_followers_count); + $(".current_toots_count_link").attr("href", current_statuses_count_link); + $(".current_following_count_link").attr("href", current_following_count_link); + $(".current_followers_count_link").attr("href", current_followers_count_link); + + replace_emoji(); + +} + +/*---------------------------------- + Set User recent images +----------------------------------*/ + +function putMessage(Message) { + + $('#overlay_message').addClass('view'); + $('#overlay_message section span').text(Message); + + setTimeout(function(){ + $("#overlay_message").removeClass("view"); + },3000); + +}; \ No newline at end of file diff --git a/public_html/assets/js/halcyon/halcyonUI.js b/public_html/assets/js/halcyon/halcyonUI.js new file mode 100644 index 0000000..bfd3d30 --- /dev/null +++ b/public_html/assets/js/halcyon/halcyonUI.js @@ -0,0 +1,3353 @@ +/*----------------------------------- + Reset +-----------------------------------*/ + +$(function() { + + $('input[type="file"]').val(''); + +}) + +/*----------------------------------- + Buttons +-----------------------------------*/ + +$(function() { + + // PREFIX A + $(document).on('click','a', function(e) { + e.stopPropagation(); + }); + + // PREFIX INPUT + $(document).on('keypress',"input.disallow_enter[type='text']", function(e) { + if((e.which == 13) || (e.keyCode == 13)){ return false; } + }); + + // FOLLOW + $(document).on('click','.follow_button', function(e) { + + e.stopPropagation(); + + if ($(this).attr('mid') !== null) { + api.post('accounts/'+$(this).attr('mid')+'/follow', function (data) { + }); + } else if ($(this).attr('data')!== null) { + api.post("follows", {uri:$(this).attr('data')}, function (data) { + }); + } + + $(this).toggleClass('follow_button'); + $(this).toggleClass('following_button'); + $(this).html('Following'); + + return false; + }); + + // FOLLOWING + $(document).on('click','.following_button', function(e) { + + e.stopPropagation(); + + if ($(this).attr('mid') !== null) { + api.post('accounts/'+$(this).attr('mid')+'/unfollow', function (data) { + }); + } + $(this).toggleClass('following_button'); + $(this).toggleClass('follow_button'); + $(this).html('Follow'); + + return false; + }); + + // MUTE + $(document).on('click','.mute_button', function(e) { + + if ($(this).attr('mid') !== null) { + api.post('accounts/'+$(this).attr('mid')+'/mute', function (data) { + }); + } + + putMessage("You'll no longer receive notifications from this user"); + return false; + }); + + // UNMUTE + $(document).on('click','.muting_button', function(e) { + + if($(this).attr('mid')!=null) { + api.post('accounts/'+$(this).attr('mid')+'/unmute', function (data) { + }); + } + $(this).toggleClass('muting_button'); + $(this).toggleClass('follow_button'); + $(this).html('Follow'); + + putMessage("Unmuted this user"); + return false; + }); + + // BLOCK + $(document).on('click','.block_button', function(e) { + + if ($(this).attr('mid') !== null) { + api.post('accounts/'+$(this).attr('mid')+'/block', function (data) { + }); + } + + putMessage("This user has been blocked"); + return false; + + }); + + // UNBLOCK + $(document).on('click','.blocking_button', function(e) { + + e.stopPropagation(); + + if ($(this).attr('mid') !== null) { + api.post('accounts/'+$(this).attr('mid')+'/unblock', function (data) { + }); + } + $(this).toggleClass('blocking_button'); + $(this).toggleClass('follow_button'); + $(this).html('Follow'); + + putMessage("Unblocked this user"); + return false; + }); + + // BOOST + $(document).on('click','.boost_button', function(e) { + + e.stopPropagation(); + + if($(this).attr('reblogged') !== 'true'){ + api.post("statuses/"+$(this).attr('tid')+"/reblog", function (data) { + }); + $(this).attr('reblogged', "true"); + $(this).toggleClass('active'); + } else { + api.post("statuses/"+$(this).attr('tid')+"/unreblog", function (data) { + }); + $(this).attr('reblogged', "hold"); + $(this).toggleClass('active'); + $(this).mouseout(function(e) { + $(this).attr('reblogged', "null"); + }); + } + + return false; + }); + + // FAVOURITE + $(document).on('click','.fav_button', function(e) { + + e.stopPropagation(); + + if($(this).attr('favourited') !== 'true'){ + api.post("statuses/"+$(this).attr('tid')+"/favourite", function (data) { + }); + $(this).attr('favourited', "true"); + $(this).toggleClass('active'); + } else { + api.post("statuses/"+$(this).attr('tid')+"/unfavourite", function (data) { + }); + $(this).attr('favourited', "hold"); + $(this).toggleClass('active'); + $(this).mouseout(function(e) { + $(this).attr('favourited', "null"); + }); + } + + return false; + }); + + // DELETE + $(document).on('click','.delete_button', function(e) { + + const sid = $(this).attr('tid'); + + api.delete("statuses/"+sid, function (data) { + $('.toot_entry[sid="'+sid+'"]').remove(); + putMessage("Your Toot has been deleted"); + }); + + }); + + // CONTENTS WARNING + $(document).on('click','.cw_button', function(e) { + + e.stopPropagation(); + const article = $(this).parent(); + + if ( article.hasClass('content_warning') ) { + $(this).text('SHOW LESS'); + article.removeClass('content_warning'); + } else { + $(this).text('SHOW MORE'); + article.addClass('content_warning'); + } + + return false; + }); + + // NOT SAFE FOR WORK + $(document).on('click','.sensitive_alart', function(e) { + + e.stopPropagation(); + + $(this).toggleClass('invisible'); + + return false; + }); + + // HEADER AVATAR BUTTON + $(document).on('click','.header_account_avatar', function(e) { + e.stopPropagation(); + $(this).next('.header_my_account_nav').toggleClass('invisible'); + }); + + // EXPAND TOOT MENU + $(document).on('click','.expand_button', function(e) { + e.stopPropagation(); + $(this).next('.expand_menu').toggleClass('invisible'); + return false; + }); + + // 連投防止 + $(document).on('click','.status_form.ready .active_submit_button', function(e) { + e.stopImmediatePropagation() + return false; + }); + +}); + +/*----------------------------------- + Reset Buttons +-----------------------------------*/ + +$(function() { + + $(document).on('click', function(e) { + $('.header_my_account_nav').addClass('invisible'); + $('.expand_menu').addClass('invisible'); + }); + +}) + +/*---------------------------------- + Get Media attachment UI +----------------------------------*/ + +function mediaattachments_template(status) { + + let media_views = ""; + + if ( status.media_attachments[0].url === "/files/original/missing.png" ) { + return ""; + } else if ( !status.sensitive ) { + // NORMAL CONTENT + media_views = `
`; + } else { + // SENSITIVE CONTENT + media_views = ` +
+
+ Sensitive content + Click to view +
+ `; + } + + if ( status.media_attachments[0].type === "video" | status.media_attachments[0].type === "gifv" ) { + // VIDEO CONTENT + media_views += (` +
+ +
+ `); + } else { + // IMAGE CONTENT LENGTH 1 OR 2 + if ( status.media_attachments.length <= 2 ) { + for ( let i in status.media_attachments ) { + media_views += (` +
+ +
+ `); + } + // IMAGE CONTENT LENGTH 3 OR MORE THAN + } else { + for ( let i in status.media_attachments ) { + if (Number(i) === 1) { + media_views += (` +
+ +
+ +
+ `); + } else { + media_views += (` +
+ +
+ `); + } + } + media_views += "
"; + } + media_views += "
"; + } + + return media_views; +} + +/*---------------------------------- + Get Timeline UI +----------------------------------*/ + +function timeline_template(status) { + + if (status.reblog === null) { + + // What to follow + if ( + status.account.id !== JSON.parse(localStorage.getItem("what_to_follow_0")).id & + status.account.id !== JSON.parse(localStorage.getItem("what_to_follow_1")).id & + status.account.id !== JSON.parse(localStorage.getItem("what_to_follow_2")).id & + status.account.id !== current_id + ) { + localStorage.setItem("what_to_follow_"+String(Math.floor(Math.random()*3)), JSON.stringify(status.account) ); + } + + const status_account_link = getRelativeURL(status.account.url, status.account.id), + status_datetime = getRelativeDatetime(Date.now(), getConversionedDate(null, status.created_at)), + status_attr_datetime = getConversionedDate(null, status.created_at); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if ( status.spoiler_text ) { + alart_text = ""+status.spoiler_text+"", + article_option = "content_warning"; + } + + // REBLOGS COUNT + if (status.reblogs_count) { + toot_reblogs_count = status.reblogs_count; + } + + // FAVOURITES COUNT + if (status.favourites_count) { + toot_favourites_count = status.favourites_count; + } + + // MEDIA ATTACHMENTS + if ( status.media_attachments.length ) { + media_views = mediaattachments_template(status); + } + + // TEMPLATE + const html=(` +
  • +
    + + +
    + +
    +
    + +
    + +
    + + +
    + +
    + ${alart_text} + + ${status.content} + + ${media_views} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
  • + `); + + return $(html) + + } else { + + // What to follow + if ( + status.reblog.account.id !== JSON.parse(localStorage.getItem("what_to_follow_0")).id & + status.reblog.account.id !== JSON.parse(localStorage.getItem("what_to_follow_1")).id & + status.reblog.account.id !== JSON.parse(localStorage.getItem("what_to_follow_2")).id & + status.account.id !== current_id + ) { + localStorage.setItem("what_to_follow_" + String(Math.floor(Math.random()*3)), JSON.stringify(status.reblog.account)); + } + + const status_datetime = getRelativeDatetime(Date.now(), getConversionedDate(null, status.reblog.created_at)), + status_attr_datetime = getConversionedDate(null, status.reblog.created_at), + status_reblog_account_link = getRelativeURL(status.reblog.account.url, status.reblog.account.id), + status_account_link = getRelativeURL(status.account.url, status.account.id); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if ( status.reblog.spoiler_text ) { + alart_text = ""+status.reblog.spoiler_text+"", + article_option = "content_warning"; + } + + // REBLOGS COUNT + if (status.reblog.reblogs_count) { + toot_reblogs_count = status.reblog.reblogs_count; + } + + // FAVOURTITES COUNT + if (status.reblog.favourites_count) { + toot_favourites_count = status.reblog.favourites_count; + } + + // MEDIA ATTACHMENTS + if ( status.reblog.media_attachments.length ) { + media_views = mediaattachments_template(status.reblog); + } + + // TEMPLATE + const html = (` +
  • + +
    + + +
    + +
    +
    + +
    + +
    + + +
    + +
    + ${alart_text} + + ${status.reblog.content} + + ${media_views} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
  • + `); + + return $(html) + + } +} + +/*---------------------------------- + Get Notifications UI +----------------------------------*/ + +function notifications_template(NotificationObj) { + + // Defined for Fav/Bos/Fol/Men + const notice_author_link = getRelativeURL(NotificationObj.account.url, NotificationObj.account.id); + + // Defined for Fav/Bos + if ( NotificationObj.type === 'favourite' | NotificationObj.type === 'reblog' ) { + + const toot_author_link = getRelativeURL(NotificationObj.status.account.url, NotificationObj.status.account.id), + toot_datetime = getRelativeDatetime(Date.now(), getConversionedDate(null, NotificationObj.status.created_at)), + toot_attr_datetime = getConversionedDate(null, NotificationObj.status.created_at); + + if( NotificationObj.type=='favourite' ){ + const html = (` +
  • + +
    +
    +
    + +
    +
    +

    ${NotificationObj.status.content}

    +
    +
    +
    +
    +
  • + `); + return $(html); + + } else if ( NotificationObj.type === 'reblog' ) { + + const sid = NotificationObj.status.id, + html = (` +
  • + +
    +
    +
    + +
    +
    +

    ${NotificationObj.status.content}

    +
    +
    +
    +
    +
  • + `); + return $(html); + } + + } else if ( NotificationObj.type === 'mention' ) { + + const toot_author_link = getRelativeURL(NotificationObj.status.account.url, NotificationObj.status.account.id), + toot_datetime = getRelativeDatetime(Date.now(), getConversionedDate(null, NotificationObj.status.created_at)), + toot_attr_datetime = getConversionedDate(null, NotificationObj.status.created_at); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if (NotificationObj.status.spoiler_text) { + alart_text = ''+NotificationObj.status.spoiler_text+'', + article_option = 'content_warning'; + } + + // REBLOGS COUNT + if (NotificationObj.status.reblogs_count) { + toot_reblogs_count = NotificationObj.status.reblogs_count; + } + + // FAVOURTITES COUNT + if (NotificationObj.status.favourites_count) { + toot_favourites_count = NotificationObj.status.favourites_count; + } + + // MEDIA ATTACHMENTS + if (NotificationObj.status.media_attachments.length) { + media_views = mediaattachments_template(NotificationObj.status); + } + + const html=(` +
  • +
    + +
    + +
    +
    +
    + +
    + + +
    + +
    + ${alart_text} + + ${NotificationObj.status.content} + + ${media_views} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
  • + `); + return $(html); + + } else { + const html=(` +
  • + +
  • + `); + return $(html); + } +} + +/*---------------------------------- + Get Follows UI +----------------------------------*/ + +function follows_template(AccountObj) { + + const array = AccountObj.url.split('/'), + profile_link = '/'+array[array.length-1]+'@'+array[array.length-2]+'?mid='+AccountObj.id+'&'; + + const html = (` +
    + +
    + +
    + +
    + +
    + +
    + + + + + +
    +

    ${AccountObj.note}

    +
    + +
    +
    + `); + + return $(html) + +} + +/*---------------------------------- + Get Status UI +----------------------------------*/ + +function status_template(status, class_options) { + + if ( status.reblog === null ) { + + const status_account_link = getRelativeURL(status.account.url, status.account.id), + status_datetime = getConversionedDate(null, status.created_at), + status_attr_datetime = getConversionedDate(null, status.created_at); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if (status.spoiler_text) { + alart_text = ''+status.spoiler_text+'', + article_option = 'content_warning'; + } + + // REBLOGS COUNT + if (status.reblogs_count) { + toot_reblogs_count = status.reblogs_count; + } + + // FAVOURITES COUNT + if (status.favourites_count) { + toot_favourites_count = status.favourites_count; + } + + // MEDIA ATTACHMENTS + if (status.media_attachments.length) { + media_views = mediaattachments_template(status); + } + + // TEMPLATE + const html=(` +
    +
    +
    +
    + +
    + + + ${status.account.display_name} + + + @${status.account.acct} + + + +
    +
    +
    + ${alart_text} + + ${status.content} + + ${media_views} +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + + + + + +
    + +
    + + + +
    + `); + + // change URL + history.pushState(null, null, getRelativeURL(status.account.url, status.account.id, '/status/'+status.id)); + + return $(html) + + } else { + + const status_datetime = getConversionedDate(null, status.reblog.created_at), + status_attr_datetime = getConversionedDate(null, status.reblog.created_at), + status_reblog_account_link = getRelativeURL(status.reblog.account.url, status.reblog.account.id), + status_account_link = getRelativeURL(status.reblog.account.url, status.reblog.account.id); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if (status.spoiler_text) { + alart_text = ''+status.reblog.spoiler_text+'', + article_option = 'content_warning'; + } + + // REBLOGS COUNT + if (status.reblog.reblogs_count) { + toot_reblogs_count = status.reblog.reblogs_count; + } + + // FAVOURTITES COUNT + if (status.reblog.favourites_count) { + toot_favourites_count = status.reblog.favourites_count; + } + + // MEDIA ATTACHMENTS + if(status.reblog.media_attachments.length){ + media_views = mediaattachments_template(status.reblog); + } + + // TEMPLATE + const html=(` +
    +
    + +
    +
    + +
    + + + + ${status.reblog.account.display_name} + + + @${status.reblog.account.acct} + + + + + +
    + +
    + +
    + ${alart_text} + + ${status.reblog.content} + + ${media_views} +
    + + + +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + + + + + +
    + +
    + + + +
    + `); + + // change URL + history.pushState(null, null, getRelativeURL(status.reblog.account.url, status.reblog.id, '/status/'+status.reblog.id)); + return $(html) + + } +} + +/*---------------------------------- + Get Media UI +----------------------------------*/ + +function media_template(status, mediaURL) { + + if ( !status ) { + const html = (` +
    + +
    + +
    + +
    + `); + return $(html) + } else { + + const status_template = timeline_template(status).html(), + html = (` +
    + +
    + +
    + +
    + ${status_template} +
    + +
    + `); + return $(html) + } + +} + +/*---------------------------------- + Get Context UI +----------------------------------*/ + +function context_template(status, class_options) { + + if ( status.reblog === null ) { + + const status_account_link = getRelativeURL(status.account.url, status.account.id), + status_datetime = getRelativeDatetime(Date.now(), getConversionedDate(null, status.created_at)), + status_attr_datetime = getConversionedDate(null, status.created_at); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if ( status.spoiler_text ) { + alart_text = ''+status.spoiler_text+'', + article_option = 'content_warning'; + } + + // REBLOGS COUNT + if (status.reblogs_count) { + toot_reblogs_count = status.reblogs_count; + } + + // FAVOURITES COUNT + if (status.favourites_count) { + toot_favourites_count = status.favourites_count; + } + + // MEDIA ATTACHMENTS + if( status.media_attachments.length) { + media_views = mediaattachments_template(status); + } + + // TEMPLATE + const html=(` +
    +
    + +
    + +
    +
    + +
    + + + ${status.account.display_name} + + + @${status.account.acct} + + + + +
    + +
    + ${alart_text} + + ${status.content} + + ${media_views} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + `); + + return $(html) + + } else { + + const status_datetime = getRelativeDatetime(Date.now(), getConversionedDate(null, status.reblog.created_at)), + status_attr_datetime = getConversionedDate(null, status.reblog.created_at), + status_reblog_account_link = getRelativeURL(status.reblog.account.url, status.reblog.account.id), + status_account_link = getRelativeURL(status.account.url, status.account.id); + + let alart_text = "", + article_option = "", + toot_reblogs_count = "", + toot_favourites_count = "", + media_views = ""; + + // CONTENT WARNING + if ( status.spoiler_text ) { + alart_text = ''+status.reblog.spoiler_text+'', + article_option = 'content_warning'; + } + + // REBLOGS COUNT + if (status.reblog.reblogs_count) { + toot_reblogs_count = status.reblog.reblogs_count; + } + + // FAVOURTITES COUNT + if (status.reblog.favourites_count) { + toot_favourites_count = status.reblog.favourites_count; + } + + // MEDIA ATTACHMENTS + if (status.reblog.media_attachments.length) { + media_views = mediaattachments_template(status.reblog); + } + + // TEMPLATE + const html=(` +
    + +
    +
    + +
    +
    + +
    + + + ${status.reblog.account.display_name} + + + @${status.reblog.account.acct} + + + + +
    + +
    + ${alart_text} + + ${status.reblog.content} + + ${media_views} +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + `); + + return $(html) + + } +} + +/*---------------------------------- + Set Timeline +----------------------------------*/ + +function setTimeline(level,load_options) { + + let isSyncing = true; + + if ( load_options === undefined ) { + var load_options = []; + } + + // Get timeline + api.get(level, load_options, function(statuses) { + + let reply_sources = {}; + for ( let i in statuses ) { + + timeline_template(statuses[i]).appendTo("#js-timeline"); + + if (statuses[i].in_reply_to_id && level === "timelines/home" | level === "timelines/public" ) { + + // 同じ返信先が無い場合 + if (!reply_sources[statuses[i].in_reply_to_id] & !$(".toot_entry[sid='"+statuses[i].in_reply_to_id+"']").length ) { + reply_sources[statuses[i].in_reply_to_id] = statuses[i].id; + api.get('statuses/'+statuses[i].in_reply_to_id, function(in_reply_statuses) { + $("#js-timeline .toot_entry[sid='"+reply_sources[in_reply_statuses.id]+"']").before(context_template(in_reply_statuses, 'ancestors_status default_padding')); + replace_emoji(); + }); + } + + } + + }; + + links = getLinkFromXHRHeader(responce_headers); + replaceInternalLink(); + replace_emoji(); + + if (!statuses.length) { + $('#js-timeline_footer > i').css({"display":"none"}); + } + + isSyncing = false; + + }); + + // Infinite scroll + $(window).scroll(function () { + + // Load before 700px from last + if ( $(window).scrollTop()+window.innerHeight >= $(document).height()-700 ) { + + if (!isSyncing) { + + isSyncing = true; + load_options.unshift( {name:"max_id",data:links['next'].match(/max_id=(.+)&?/)[1]} ); + + api.get(level, load_options, function(statuses) { + + if (statuses.length) { + + let reply_sources = {}; + for ( let i in statuses ) { + + timeline_template(statuses[i]).appendTo("#js-timeline"); + + if (statuses[i].in_reply_to_id && level === "timelines/home" | level === "timelines/public" ) { + if (!reply_sources[statuses[i].in_reply_to_id] & !$(".toot_entry[sid='"+statuses[i].in_reply_to_id+"']").length) { + reply_sources[statuses[i].in_reply_to_id] = statuses[i].id; + api.get('statuses/'+statuses[i].in_reply_to_id, function(in_reply_statuses) { + $("#js-timeline .toot_entry[sid='"+reply_sources[in_reply_statuses.id]+"']").before(context_template(in_reply_statuses, 'ancestors_status default_padding')); + replace_emoji(); + }); + } + + } + + }; + + links = getLinkFromXHRHeader(responce_headers); + replaceInternalLink(); + replace_emoji(); + isSyncing = false; + + } else { + + $('.timeline_footer > i').css({"display":"none"}); + $('.timeline_footer').append(''); + isSyncing = true; + + } + }); + + load_options.shift(); + + }; + + }; + + }); + + // Streaming + $(function() { + + if ( level === "timelines/home" ) { + var streamscope = "user", + scope = "home"; + } else if ( level === "timelines/public" & load_options.length) { + var streamscope = "public:local", + scope = "local"; + } else if ( level === "timelines/public" & !load_options.length) { + var streamscope = "public", + scope = "federated"; + } + + let statuses = []; + const original_title = $('title').text(); + + api.stream(streamscope, function(userstream) { + + if (userstream.event === "update") { + + const streaming_option = localStorage.getItem("setting_post_stream"); + + if ( streaming_option === "manual" ) { + // Is alredy exist? + if ( !$('.toot_entry[sid="'+userstream.payload.id+'"]').length ) { + + $('#js-stream_update').css({'display':'block','height':'auto','padding':'10px'}); + statuses.unshift(userstream.payload); + $('#js-stream_update > button > span').text(statuses.length); + $('title').text("("+statuses.length+") "+original_title); + + $('#header .header_nav_list .'+scope+'_badge').removeClass('invisible'); + + } + } else if ( streaming_option === "auto" ) { + // Is not alredy exist + if ( !$('.toot_entry[sid="'+userstream.payload.id+'"]').length ) { + + timeline_template(userstream.payload).prependTo("#js-timeline"); + replaceInternalLink(); + replace_emoji(); + + //context + if ( level === "timelines/home" | level === "timelines/public" ) { + if (userstream.payload.in_reply_to_id & !$(".toot_entry[sid='"+userstream.in_reply_to_id+"']").length) { + let reply_source = userstream.payload.id; + api.get('statuses/'+userstream.payload.in_reply_to_id, function(in_reply_statuses) { + $("#js-timeline .toot_entry[sid='"+reply_source+"']").before(context_template(in_reply_statuses, 'ancestors_status default_padding')); + replaceInternalLink(); + replace_emoji(); + }); + } + } + + } + } + } + }); + + $(document).on('click','#js-stream_update', function(e) { + + $('#header .header_nav_list .'+scope+'_badge').addClass('invisible'); + $('#js-stream_update').css({'display':'none','height':'0','padding':'0px'}); + + statuses.reverse(); + + for ( let i in statuses ) { + timeline_template(statuses[i]).prependTo("#js-timeline"); + replace_emoji(); + + // context + if ( level === "timelines/home" | level === "timelines/public" ) { + if (statuses[i].in_reply_to_id) { + const reply_source = statuses[i].id; + api.get('statuses/'+statuses[i].in_reply_to_id, function(in_reply_statuses) { + $("#js-timeline .toot_entry[sid='"+reply_source+"']").before(context_template(in_reply_statuses, 'ancestors_status default_padding')); + replace_emoji(); + }); + } + } + + $('title').text(original_title); + }; + + statuses = []; + + }); + + }); + +}; + +/*---------------------------------- + Set Other Timeline +----------------------------------*/ + +function setOtherTimeline(instance, load_options) { + + let isSyncing = true; + + if ( load_options === undefined ) { + var load_options = []; + } + + // Get timeline + const loadstatus = instance + "timelines/public" + api.getOther(loadstatus, load_options, function(statuses) { + + let reply_sources = {}; + for ( let i in statuses ) { + + timeline_template(statuses[i]).appendTo("#js-timeline"); + + if (statuses[i].in_reply_to_id ) { + // Is Alredy exist + if (!reply_sources[statuses[i].in_reply_to_id]) { + reply_sources[statuses[i].in_reply_to_id] = statuses[i].id; + api.getOther(instance + 'statuses/'+statuses[i].in_reply_to_id, function(in_reply_statuses) { + $("#js-timeline .toot_entry[sid='"+reply_sources[in_reply_statuses.id]+"']").before(context_template(in_reply_statuses, 'ancestors_status default_padding')); + replace_emoji(); + }); + } + } + + }; + + $('.toot_entry .toot_footer').addClass('invisible'); + links = getLinkFromXHRHeader(responce_headers); + replaceInternalLink(); + replace_emoji(); + + if (!statuses.length) { + $('#js-timeline_footer > i').css({"display":"none"}); + } + + isSyncing = false; + + }); + + // Infinite scroll + $(window).scroll(function () { + + // Load before 700px from last + if ( $(window).scrollTop()+window.innerHeight >= $(document).height()-700 ) { + + if (!isSyncing) { + + isSyncing = true; + load_options.unshift( {name:"max_id",data:links['next'].match(/max_id=(.+)&?/)[1]} ); + + api.getOther(loadstatus, load_options, function(statuses) { + + if (statuses.length) { + + let reply_sources = {}; + for ( let i in statuses ) { + + timeline_template(statuses[i]).appendTo("#js-timeline"); + + if (statuses[i].in_reply_to_id ) { + // alredy exist + if (!reply_sources[statuses[i].in_reply_to_id]) { + reply_sources[statuses[i].in_reply_to_id] = statuses[i].id; + api.getOther(instance+'statuses/'+statuses[i].in_reply_to_id, function(in_reply_statuses) { + $("#js-timeline .toot_entry[sid='"+reply_sources[in_reply_statuses.id]+"']").before(context_template(in_reply_statuses, 'ancestors_status default_padding')); + replace_emoji(); + }); + } + } + + }; + + $('.toot_entry .toot_footer').addClass('invisible'); + links = getLinkFromXHRHeader(responce_headers); + replaceInternalLink(); + replace_emoji(); + isSyncing = false; + + } else { + + $('.timeline_footer > i').css({"display":"none"}); + $('.timeline_footer').append(''); + isSyncing = true; + + } + }); + + load_options.shift(); + + }; + + }; + + }); + +}; + +/*---------------------------------- + Set notifications +----------------------------------*/ + +function setNotifications(load_options) { + + let isSyncing = true; + + if (load_options === undefined) { + var load_options = []; + } + + // Get notice + api.get('notifications', load_options, function(NotificationObj) { + + for (let i in NotificationObj) { + notifications_template(NotificationObj[i]).appendTo("#js-timeline"); + }; + + links = getLinkFromXHRHeader(responce_headers); + replaceInternalLink(); + replace_emoji(); + + if (!NotificationObj.length) { + $('#js-timeline_footer > i').css({"display":"none"}); + } + + isSyncing = false; + + }); + + // Infinite scroll + $(window).scroll(function () { + + // Load before 700px + if($(window).scrollTop() + window.innerHeight >= $(document).height()-700) { + + if( !isSyncing ){ + + isSyncing = true; + // get latest status id + load_options.unshift( {name:"max_id",data:links['next'].match(/max_id=(.+)&?/)[1]} ); + + api.get('notifications', load_options, function(NotificationObj) { + + if (NotificationObj.length) { + + for (let i in NotificationObj) { + notifications_template(NotificationObj[i]).appendTo("#js-timeline"); + }; + + links = getLinkFromXHRHeader(responce_headers); + replaceInternalLink(); + replace_emoji(); + isSyncing = false; + + } else { + + $('.timeline_footer > i').css({"display":"none"}); + $('.timeline_footer').append(''); + isSyncing = true; + + } + + }); + + load_options.shift(); + + }; + + }; + + }); + + api.stream("user", function(userstream) { + const original_title = $('title').text(); + + if (userstream.event === "notification") { + + const streaming_option = localStorage.getItem("setting_post_stream"); + + if ( streaming_option === "manual" ) { + // todo + } else if ( streaming_option === "auto" ) { + notifications_template(userstream.payload).prependTo("#js-timeline"); + replaceInternalLink(); + replace_emoji(); + } + + } + }); + +} + +/*---------------------------------- + Set Following/Followers +----------------------------------*/ + +function setFollows(mid, param, load_options) { + + let isSyncing = true, + followsList = []; + + api.get('accounts/'+mid+'/'+param, load_options, function(follows) { + + + for (let i in follows) { + follows_template(follows[i]).appendTo("#js-follows_profile"); + followsList.unshift(follows[i].id); + }; + + api.getArray('accounts/relationships', [{name:'id', data:followsList}], function(RelationshipsObj) { + for ( let i in RelationshipsObj ) { + if ( RelationshipsObj[i].following ) { + const button = $('#js-follows_profile .follow_button[mid="'+RelationshipsObj[i].id+'"]'); + button.removeClass("follow_button"); + button.addClass("following_button"); + button.text('Following'); + } + } + }); + + links = getLinkFromXHRHeader(responce_headers); + replace_emoji(); + + $("#js-follows_footer > i").css({"display":"none"}); + isSyncing = false; + + }); + + // Infinite scroll + $(window).scroll(function () { + + if ($(window).scrollTop() + window.innerHeight >= $(document).height()-700) { + + if( !isSyncing ){ + isSyncing = true; + + // get latest id + load_options.unshift( {name:"max_id",data:links['next'].match(/max_id=(.+)&?/)[1]} ); + + api.get('accounts/'+mid+'/'+param, load_options, function(follows) { + + let followsList = []; + + if (follows.length) { + + for(let i in follows) { + follows_template(follows[i]).appendTo("#js-follows_profile"); + followsList.unshift(follows[i].id); + }; + + api.getArray('accounts/relationships', [{name:'id', data:followsList}], function(RelationshipsObj) { + for ( let i in RelationshipsObj ) { + if ( RelationshipsObj[i].following ) { + const button = $('#js-follows_profile .follow_button[mid="'+RelationshipsObj[i].id+'"]'); + button.removeClass("follow_button"); + button.addClass("following_button"); + button.text('Following'); + } + } + }); + + links = getLinkFromXHRHeader(responce_headers); + replace_emoji(); + isSyncing = false; + + } else { + isSyncing = true; + } + + }); + + load_options.shift(); + + }; + + }; + + }); + +}; + +/*---------------------------------- + Set user search +----------------------------------*/ + +function setUserSearch(query) { + + api.get('search', [{name:'q',data:query},{name:'resolve',data:'true'}], function(search) { + + for(let i in search.accounts) { + follows_template(search.accounts[i]).appendTo("#js-follows_profile");; + } + + $("#js-follows_footer > i").css({"display":"none"}); + replace_emoji(); + + }); + +}; + +/*---------------------------------- + Set Relationship +----------------------------------*/ + +function setAccount(AccountObj) { + + $("#js_header_image").attr('src', AccountObj.header); + $("#js_profile_image").attr('src', AccountObj.avatar); + $("#js_toots_count").text(AccountObj.statuses_count); + $("#js_following_count").text(AccountObj.following_count); + $("#js_followers_count").text(AccountObj.followers_count); + $("#js_profile_displayname").text(AccountObj.display_name); + $("#js_profile_username").text(AccountObj.acct); + $("#js_profile_bio").html(AccountObj.note); + + if( AccountObj.id === current_id ) { + + $(` + + + `).appendTo('.profile_button_box'); + + $(` + +

    FAVOURITES

    + Show +
    + `).appendTo("#js-profile_nav_favourites"); + + } else { + + api.get('accounts/relationships', [{name:'id', data:String(AccountObj.id)}], function(RelationshipObj) { + + if (RelationshipObj[0].followed_by) { + $('#main .profile_username .profile_followed_by').removeClass('invisible'); + } + + if (RelationshipObj[0].blocking) { + $(` + + `).appendTo('.profile_button_box'); + + } else if (RelationshipObj[0].muting) { + $(` + + `).appendTo('.profile_button_box'); + + } else if (RelationshipObj[0].requested) { + $(` + + + `).appendTo('.profile_button_box'); + + } else if(RelationshipObj[0].following){ + $(` + + `).appendTo('.profile_button_box'); + + } else { + $(` + + `).appendTo('.profile_button_box'); + } + }); + }; + + replace_emoji(); + +} + +/*---------------------------------- + Set User recent images +----------------------------------*/ + +function setRecentImages(mid) { + + api.get("accounts/"+mid+"/statuses", [{name:'only_media',data:'true'},{name:'limit',data:'6'}], function(statuses) { + + if ( statuses.length ) { + + $('#js_profile_recent_images span').text(`${statuses[0].account.statuses_count} Photos and toots`); + $('#js_profile_recent_images a').attr('href', $("#media_link").attr('href')); + + for ( i in statuses ) { + $(` +
    + +
    + `).appendTo('#js_profile_recent_images_box'); + }; + + } + + }); + +}; + +/*---------------------------------- + Header tabs badge +----------------------------------*/ + +function badges_update(){ + + let current_count = Number(localStorage.getItem("notification_count")); + if ( current_count ) { + $('#header .header_nav_list .notification_badge').removeClass('invisible'); + $('#header .header_nav_list .notification_badge').text( current_count ); + } + + api.stream("user", function(userstream) { + + if (userstream.event === "update" & location.pathname !== "/" ) { + $('#header .header_nav_list .home_badge').removeClass('invisible'); + } else if (userstream.event === "notification" & location.pathname !== "/notifications") { + current_count += 1; + localStorage.setItem("notification_count", current_count ); + $('#header .header_nav_list .notification_badge').text( current_count ); + if ( $('#header .header_nav_list .notification_badge').hasClass('invisible') ) { + $('#header .header_nav_list .notification_badge').removeClass('invisible') + } + } + + }); +} + +/*---------------------------------- + [T]Set Overlay status +----------------------------------*/ + +function setOverlayStatus(sid) { + + // Check seletcting text or not + if ( !window.getSelection().toString() ) { + + // RESET + $("#js-overlay_content .temporary_object").empty() + + // If not seletcting text, show status details + $('#js-overlay_content_wrap').addClass('view'); + $('#js-overlay_content_wrap').addClass('black_05'); + + api.get('statuses/'+sid+'/', function(status) { + + $('
    ').appendTo("#js-overlay_content .temporary_object"); + status_template(status, 'main_status').appendTo('#js-overlay_content .toot_detail_wrap'); + + replaceInternalLink(); + replace_emoji(); + + api.get('statuses/'+sid+'/context', function(status) { + + if (status.ancestors.length) { + status.ancestors.reverse(); + for ( let i in status.ancestors ) { + context_template(status.ancestors[i], 'ancestors_status').prependTo("#js-overlay_content .temporary_object .toot_detail_wrap"); + } + } + + if (status.descendants.length) { + for ( let i in status.descendants) { + context_template(status.descendants[i], 'descendants_status').appendTo("#js-overlay_content .temporary_object .toot_detail_wrap"); + } + } + + replaceInternalLink(); + replace_emoji(); + + }); + + }); + } + +} + +// triger +$(function() { + + // PREFIX + $(document).on('click','.toot_entry.ancestors_status, .toot_entry.descendants_status', function(e) { + $("#js-overlay_content .temporary_object").empty(); + }); + + // toot status + $(document).on('click','.toot_entry', function(e) { + setOverlayStatus($(this).attr('sid')); + }); + +}) + +/*---------------------------------- + [T]Set Overlay media +----------------------------------*/ + +function setOverlayMedia(sid,url) { + + // RESET + $("#js-overlay_content .temporary_object").empty() + + // If not seletcting text, show status details + $('#js-overlay_content_wrap').addClass('view'); + $('#js-overlay_content_wrap').addClass('black_08'); + $('#js-overlay_content .temporary_object').addClass('visible'); + + api.get("statuses/"+sid, function(status) { + + if ( !status.reblog ) { + media_template(status, url).appendTo("#js-overlay_content .temporary_object"); + replaceInternalLink(); + replace_emoji(); + } else { + media_template(status.reblog, url).appendTo("#js-overlay_content .temporary_object"); + replaceInternalLink(); + replace_emoji(); + } + + }); + +} + +// triger +$(function() { + + // overlay media + $(document).on('click','.media_attachment[otype="image"]', function(e) { + // Stop setOverlayStatus() + e.stopPropagation(); + setOverlayMedia($(this).attr('sid'),$(this).attr('url')); + $('.media_detail .toot_entry .media_views').addClass('invisible'); + }); + +}) + +/*---------------------------------- + [T]Set Overlay media without status +----------------------------------*/ + +function setOverlayMediaWithoutStatus(url) { + + // RESET + $("#js-overlay_content .temporary_object").empty() + + // If not seletcting text, show status details + $('#js-overlay_content_wrap').addClass('view'); + $('#js-overlay_content_wrap').addClass('black_05'); + + media_template(null, url).appendTo("#js-overlay_content .temporary_object"); + +} + +// triger +$(function() { + + // overlay media + $(document).on('click','img[mediaaccess="true"]', function(e) { + // Stop setOverlayStatus() + e.stopPropagation(); + setOverlayMediaWithoutStatus($(this).attr('src')); + }); + +}) + +/*----------------------------------- + [P]Create status: Overlay +-----------------------------------*/ + +$(function() { + + // EXPAND + $(document).on('click', '#creat_status', function(e) { + + $('.overlay_status').removeClass('invisible'); + $("#js-overlay_content_wrap .temporary_object").empty(); + + $('#js-overlay_content_wrap').addClass('view'); + $('#js-overlay_content_wrap').addClass('black_08'); + $('#overlay_status_form .status_textarea textarea').addClass('focus'); + $('.overlay_status .submit_status_label').addClass('active_submit_button'); + $('#overlay_status_form .status_textarea textarea').focus() + $('#overlay_status_form input[name="privacy_option"]').val([localStorage.getItem("setting_post_privacy")]); + $('#overlay_status_form .expand_privacy_menu_button > i').attr('class', "fa " + localStorage.getItem("setting_post_privacy")); + + }); + + // TEXTAREA + $(document).on('change keyup','#overlay_status_form textarea, #overlay_status_form .status_spoiler', function(e) { + + if ( + e.keyCode !== 224 & + e.keyCode !== 17 & + e.keyCode !== undefined + //!$('#overlay_status_form').hasClass('ready') + ) { + + const textCount = $('#overlay_status_form textarea').val().length + $('#overlay_status_form .status_spoiler').val().length; + let textLen = ( 512 - textCount ); + + if ( textLen <= -1 ) { + $('#overlay_status_form .character_count').addClass('red'); + $('#overlay_status_form').addClass('ready'); + } else if ( textLen === 512 ) { + $('#overlay_status_form').addClass('ready'); + } else { + $('#overlay_status_form .character_count').removeClass('red'); + $('#overlay_status_form').removeClass('ready'); + } + + $(this).val(replaced_emoji_return($(this).val())); + $('#overlay_status_form .character_count').text(textLen); + + } + + }); + + // CONTENT WARNING BUTTON + $(document).on('click','#overlay_status_form .status_CW', function(e) { + $('#overlay_status_form .status_spoiler').toggleClass('invisible'); + }); + + // EXPAND PRIVACY + $(document).on('click','#overlay_status_form .expand_privacy_menu_button', function(e) { + $('#overlay_status_form .expand_privacy_menu').removeClass('invisible'); + }); + + // SET PRIVACY + $(document).on('click','#overlay_status_form .status_privacy.select_privacy', function(e) { + e.stopPropagation(); + $('#overlay_status_form .expand_privacy_menu_button > i').attr('class', $(this).attr('privacyicon')); + $('#overlay_status_form .expand_privacy_menu').addClass('invisible'); + }); + + // MEDIA ATTACHMENT + $(document).on('change','#overlay_status_media_atta', function(e) { + + $('#overlay_status_form .media_attachments_preview_area').empty(); + $('#overlay_status_form .status_textarea .media_attachments_preview_area').removeClass('invisible'); + + for ( let i = 0, f; f = e.target.files[i]; i++ ) { + + let reader = new FileReader(); + reader.readAsDataURL(f); + reader.onloadend = (function() { + return function (e) { + const html = (` +
    + +
    + `); + $(html).appendTo('#overlay_status_form .media_attachments_preview_area'); + } + })(f); + + } + }); + + // NOT SAFE FOR WORK + $(document).on('click','#overlay_status_form .status_NSFW', function(e) { + $('#overlay_status_form .media_attachments_preview_area').toggleClass('nsfw'); + }); + + // TOOT SUBMIT BUTTON + $(document).on('click','#overlay_status_form .submit_status_label', function(e) { + + $('#overlay_status_form').addClass('ready'); + $('#overlay_status_form .status_textarea').addClass('disallow_select'); + $('#overlay_status_form .character_count').html(''); + + const form = document.forms.overlay_status_form; + if ( !$('#overlay_status_media_atta')[0].files.length ) { + + const params = { + status : form.status_textarea.value, + sensitive : form.status_nsfw.checked, + spoiler_text : form.status_spoiler.value, + visibility : form.privacy_option.value + } + + api.post("statuses", params, function (data) { + $('#overlay_status_form .media_attachments_preview_area').empty(); + $('#overlay_status_form .status_spoiler').addClass('invisible'); + $('#overlay_status_form .status_textarea .media_attachments_preview_area').addClass('invisible'); + form.reset(); + $('#overlay_status_form').removeClass('ready'); + $('#overlay_status_form .status_textarea').removeClass('disallow_select'); + $('#overlay_status_form .character_count').html('512'); + $('.overlay_status .submit_status_label').removeClass('active_submit_button'); + $('.overlay_status').addClass('invisible'); + $('#js-overlay_content_wrap').removeClass('view'); + $('#js-overlay_content_wrap').removeClass('black_05'); + putMessage('Your Toot was posted!'); + }); + + } else { + + const dummy_form = $('
    ').append($('#overlay_status_media_atta')), + files = dummy_form[0][0].files, + filesLen = files.length -1; + + let media_array = []; + + $("#overlay_status_form .status_bottom").append($('')); + + for (let i=0; i i').attr('class', $(this).attr('privacyicon')); + $('#header_status_form .expand_privacy_menu').addClass('invisible'); + }); + + // EXPAND TEXT AREA + $(document).on('click','#header_status_form', function(e) { + if(!$('#header_status_form .status_textarea textarea').hasClass('focus')) { + $('#header_status_form input[name="privacy_option"]').val([localStorage.getItem("setting_post_privacy")]); + $('#header_status_form .expand_privacy_menu_button > i').attr('class', "fa " + localStorage.getItem("setting_post_privacy")); + $('#header_status_form .status_textarea textarea').addClass('focus'); + $('#header_status_form .status_bottom').removeClass('invisible'); + $('#header_status_form .submit_status_label').addClass('active_submit_button'); + } + }); + + // MEDIA ATTACHMENT + $(document).on('change','#header_status_media_atta', function(e) { + + $('#header_status_form .media_attachments_preview_area').empty(); + $('#header_status_form .status_textarea .media_attachments_preview_area').removeClass('invisible'); + + for ( let i = 0, f; f = e.target.files[i]; i++ ) { + + let reader = new FileReader(); + reader.readAsDataURL(f); + reader.onloadend = (function() { + return function (e) { + const html = (` +
    + +
    + `); + $(html).appendTo('#header_status_form .media_attachments_preview_area'); + } + })(f); + + } + }); + + // NOT SAFE FOR WORK + $(document).on('click','#header_status_form .status_NSFW', function(e) { + $('#header_status_form .media_attachments_preview_area').toggleClass('nsfw'); + }); + + // TOOT SUBMIT BUTTON + $(document).on('click','#header_status_form .submit_status_label', function(e) { + + $('#header_status_form').addClass('ready'); + $('#header_status_form .status_textarea').addClass('disallow_select'); + $('#header_status_form .character_count').html(''); + + const form = document.forms.header_status_form; + if ( !$('#header_status_media_atta')[0].files.length ) { + + const params = { + status : form.status_textarea.value, + sensitive : form.status_nsfw.checked, + spoiler_text : form.status_spoiler.value, + visibility : form.privacy_option.value + } + + api.post("statuses", params, function (data) { + $('#header_status_form .media_attachments_preview_area').empty(); + $('#header_status_form .status_spoiler').addClass('invisible'); + $('#header_status_form .status_textarea .media_attachments_preview_area').addClass('invisible'); + form.reset(); + $('#header_status_form').removeClass('ready'); + $('#header_status_form .status_textarea').removeClass('disallow_select'); + $('#header_status_form .character_count').html('512'); + }); + + } else { + + // 擬似formに追加。そのあとクローンを元の位置に戻す。 + const dummy_form = $('
    ').append($('#header_status_media_atta')), + files = dummy_form[0][0].files, + filesLen = files.length -1; + + let media_array = []; + + $("#header_status_form .status_bottom").append($('')); + + for (let i=0; i i').attr('class', "fa " + localStorage.getItem("setting_post_privacy")); + } + }); + + // TEXTAREA + $(document).on('change keyup','#reply_status_form textarea, #reply_status_form .status_spoiler', function(e) { + + if ( + e.keyCode !== 224 & + e.keyCode !== 17 & + e.keyCode !== undefined + //!$('#overlay_status_form').hasClass('ready') + ) { + + const textCount = $('#reply_status_form textarea').val().length + $('#reply_status_form .status_spoiler').val().length; + let textLen = ( 512 - textCount ); + + if ( textLen <= -1 ) { + $('#reply_status_form .character_count').addClass('red'); + $('#reply_status_form').addClass('ready'); + } else if ( textLen === 512 ) { + $('#reply_status_form').addClass('ready'); + } else { + $('#reply_status_form .character_count').removeClass('red'); + $('#reply_status_form').removeClass('ready'); + } + + $(this).val(replaced_emoji_return($(this).val())); + $('#reply_status_form .character_count').text(textLen); + + } + + }); + + // CONTENT WARNING BUTTON + $(document).on('click','#reply_status_form .status_CW', function(e) { + $('#reply_status_form .status_spoiler').toggleClass('invisible'); + }); + + // EXPAND PRIVACY + $(document).on('click','#reply_status_form .expand_privacy_menu_button', function(e) { + $('#reply_status_form .expand_privacy_menu').removeClass('invisible'); + }); + + // SET PRIVACY + $(document).on('click','#reply_status_form .status_privacy.select_privacy', function(e) { + e.stopPropagation(); + $('#reply_status_form .expand_privacy_menu_button > i').attr('class', $(this).attr('privacyicon')); + $('#reply_status_form .expand_privacy_menu').addClass('invisible'); + }); + + // MEDIA ATTACHMENT + $(document).on('change','#reply_status_media_atta', function(e) { + + $('#reply_status_form .media_attachments_preview_area').empty(); + $('#reply_status_form .status_textarea .media_attachments_preview_area').removeClass('invisible'); + + for ( let i = 0, f; f = e.target.files[i]; i++ ) { + + let reader = new FileReader(); + reader.readAsDataURL(f); + reader.onloadend = (function() { + return function (e) { + const html = (` +
    + +
    + `); + $(html).appendTo('#reply_status_form .media_attachments_preview_area'); + } + })(f); + + } + }); + + // NOT SAFE FOR WORK + $(document).on('click','#reply_status_form .status_NSFW', function(e) { + $('#reply_status_form .media_attachments_preview_area').toggleClass('nsfw'); + }); + + // TOOT SUBMIT BUTTON + $(document).on('click','#reply_status_form .submit_status_label', function(e) { + + $('#reply_status_form').addClass('ready'); + $('#reply_status_form .status_textarea').addClass('disallow_select'); + $('#reply_status_form .character_count').html(''); + + let form = document.forms.reply_status_form; + if ( !$('#reply_status_media_atta')[0].files.length ) { + + const params = { + status : form.status_textarea.value, + sensitive : form.status_nsfw.checked, + spoiler_text : form.status_spoiler.value, + visibility : form.privacy_option.value, + in_reply_to_id : $('#reply_status_form').attr('sid') + } + + api.post("statuses", params, function (data) { + $('#reply_status_form .media_attachments_preview_area').empty(); + $('#reply_status_form .status_spoiler').addClass('invisible'); + $('#reply_status_form .status_textarea .media_attachments_preview_area').addClass('invisible'); + form.reset(); + $('#reply_status_form').removeClass('ready'); + $('#reply_status_form .status_textarea').removeClass('disallow_select'); + $('#reply_status_form .character_count').html('512'); + $('.reply_status .submit_status_label').removeClass('active_submit_button'); + context_template(data, 'descendants_status').appendTo("#js-overlay_content .temporary_object .toot_detail_wrap"); + replace_emoji(); + putMessage('Your Toot was posted!'); + }); + + } else { + + const dummy_form = $('
    ').append($('#reply_status_media_atta')), + files = dummy_form[0][0].files, + filesLen = files.length -1; + + let media_array = []; + + $('#reply_status_form .status_bottom').append($('')); + + for (let i=0; i i').attr('class', "fa " + localStorage.getItem("setting_post_privacy")); + + $('#single_reply_status_form').attr('tid',sid); + $('.single_reply_status .single_reply_status_header span').text("Reply to "+display_name); + $('#single_reply_status_form textarea').val(acct+" "); + + api.get('statuses/'+sid+'/', function(status) { + timeline_template(status).appendTo(".single_reply_status .status_preview"); + replace_emoji(); + }); + + return false; + + }); + + // TEXTAREA + $(document).on('change keyup','#single_reply_status_form textarea, #single_reply_status_form .status_spoiler', function(e) { + + if ( + e.keyCode !== 224 & + e.keyCode !== 17 & + e.keyCode !== undefined + //!$('#single_reply_status_form').hasClass('ready') + ) { + + const textCount = $('#single_reply_status_form textarea').val().length + $('#single_reply_status_form .status_spoiler').val().length; + let textLen = ( 512 - textCount ); + + if ( textLen <= -1 ) { + $('#single_reply_status_form .character_count').addClass('red'); + $('#single_reply_status_form').addClass('ready'); + } else if ( textLen === 512 ) { + $('#single_reply_status_form').addClass('ready'); + } else { + $('#single_reply_status_form .character_count').removeClass('red'); + $('#single_reply_status_form').removeClass('ready'); + } + + $(this).val(replaced_emoji_return($(this).val())); + $('#single_reply_status_form .character_count').text(textLen); + + } + + }); + + // CONTENT WARNING BUTTON + $(document).on('click','#single_reply_status_form .status_CW', function(e) { + $('#single_reply_status_form .status_spoiler').toggleClass('invisible'); + }); + + // EXPAND PRIVACY + $(document).on('click','#single_reply_status_form .expand_privacy_menu_button', function(e) { + $('#single_reply_status_form .expand_privacy_menu').removeClass('invisible'); + }); + + // SET PRIVACY + $(document).on('click','#single_reply_status_form .status_privacy.select_privacy', function(e) { + e.stopPropagation(); + $('#single_reply_status_form .expand_privacy_menu_button > i').attr('class', $(this).attr('privacyicon')); + $('#single_reply_status_form .expand_privacy_menu').addClass('invisible'); + }); + + // MEDIA ATTACHMENT + $(document).on('change','#single_reply_status_media_atta', function(e) { + + $('#single_reply_status_form .media_attachments_preview_area').empty(); + $('#single_reply_status_form .status_textarea .media_attachments_preview_area').removeClass('invisible'); + + for ( let i = 0, f; f = e.target.files[i]; i++ ) { + + let reader = new FileReader(); + reader.readAsDataURL(f); + reader.onloadend = (function() { + return function (e) { + const html = (` +
    + +
    + `); + $(html).appendTo('#single_reply_status_form .media_attachments_preview_area'); + } + })(f); + + } + }); + + // NOT SAFE FOR WORK + $(document).on('click','#single_reply_status_form .status_NSFW', function(e) { + $('#single_reply_status_form .media_attachments_preview_area').toggleClass('nsfw'); + }); + + // TOOT SUBMIT BUTTON + $(document).on('click','#single_reply_status_form .submit_status_label', function(e) { + + $('#single_reply_status_form').addClass('ready'); + $('#single_reply_status_form .status_textarea').addClass('disallow_select'); + $('#single_reply_status_form .character_count').html(''); + + let form = document.forms.single_reply_status_form; + if ( !$('#single_reply_status_media_atta')[0].files.length ) { + + const params = { + status : form.status_textarea.value, + sensitive : form.status_nsfw.checked, + spoiler_text : form.status_spoiler.value, + visibility : form.privacy_option.value, + in_reply_to_id : $('#single_reply_status_form').attr('tid') + } + + api.post("statuses", params, function (data) { + $('#single_reply_status_form .media_attachments_preview_area').empty(); + $('#single_reply_status_form .status_spoiler').addClass('invisible'); + $('#single_reply_status_form .status_textarea .media_attachments_preview_area').addClass('invisible'); + form.reset(); + $('#single_reply_status_form').removeClass('ready'); + $('#single_reply_status_form .status_textarea').removeClass('disallow_select'); + $('#single_reply_status_form .character_count').html('512'); + $('.single_reply_status .submit_status_label').removeClass('active_submit_button'); + $('.single_reply_status').addClass('invisible'); + $('#js-overlay_content_wrap').removeClass('view'); + $('#js-overlay_content_wrap').removeClass('black_05'); + $("#js-overlay_content_wrap .single_reply_status .status_preview").empty(); + putMessage('Your Reply was posted!'); + }); + + } else { + + const dummy_form = $('
    ').append($('#single_reply_status_media_atta')), + files = dummy_form[0][0].files, + filesLen = files.length -1; + + let media_array = []; + + $("#single_reply_status_form .status_bottom").append($('')); + + for (let i=0; i *, .parmanent_object > *', function(e) { + // オーバーレイ最上位子要素で止める感じ + e.stopPropagation(); + }); + + // HIDE ALL + $(document).on('click','#js-overlay_content_wrap', function(e) { + + // hide myself + $(this).removeClass('view'); + + // empty here + $("#js-overlay_content_wrap .temporary_object").empty(); + $("#js-overlay_content_wrap .single_reply_status .status_preview").empty(); + + // add here + $('#js-overlay_content_wrap .overlay_status').addClass('invisible'); + $('#js-overlay_content_wrap .single_reply_status').addClass('invisible'); + $('#js-overlay_content_wrap .overlay_copy_link').addClass('invisible'); + + // remove here + $('#js-overlay_content .temporary_object, #js-overlay_content .parmanent_object').removeClass('visible'); + $('#js-overlay_content_wrap .overlay_status .submit_status_label').removeClass('active_submit_button'); + $('#js-overlay_content_wrap .single_reply_status .submit_status_label').removeClass('active_submit_button'); + $('#js-overlay_content_wrap #reply_status_form .submit_status_label').removeClass('active_submit_button'); + $('#js-overlay_content_wrap #header_status_form .submit_status_label').removeClass('active_submit_button'); + + $('#js-overlay_content_wrap').removeClass('black_05'); + $('#js-overlay_content_wrap').removeClass('black_08'); + + // fix to original link ( using for overlay_status ) + if ( current_file === "/user" ) { + history.pushState(null, null, "/"+location.pathname.split("/")[1]+location.search); + } else { + history.pushState(null, null, current_file); + } + + }); + +}) + +/*---------------------------------- + Stream options menu +----------------------------------*/ + +$(function () { + + // EXPAND SIDE STREAM options + $(document).on('click','.side_widget.stream_options .form_title button', function(e) { + + $(this).parent().next('.pulldown_form').toggleClass('view'); + + if ( $(this).text() === "SHOW" ) { + $(this).text("HIDE"); + } else { + $(this).text("SHOW"); + } + + const html_post_steraming = $(` + + `) + + const html_post_privacy = $(` + + `) + + const html_local_instance = $(` + + `) + + const html_search_filter = $(` + + `) + + html_post_steraming.val(localStorage.getItem("setting_post_stream")); + html_post_privacy.val(localStorage.getItem("setting_post_privacy")); + html_local_instance.val(localStorage.getItem("setting_local_instance")); + html_search_filter.val(localStorage.getItem("setting_search_filter")); + + $('.post_steraming_wrap').html(html_post_steraming) + $('.post_privacy_wrap').html(html_post_privacy); + $('.local_instance_wrap').html(html_local_instance); + $('.search_filter_wrap').html(html_search_filter); + + return false; + }); + + $(document).on('change',".post_steraming_wrap select[name='post_steraming']", function(e) { + localStorage.setItem("setting_post_stream", $(this).val() ); + putMessage("Changed setting to "+$(this).val() ); + }); + + $(document).on('change', ".post_privacy_wrap select[name='post_privacy']", function(e) { + localStorage.setItem("setting_post_privacy", $(this).val() ); + putMessage("Changed setting to "+$(this).val() ); + }); + + $(document).on('change',".search_filter_wrap select[name='search_filter']", function(e) { + localStorage.setItem("setting_search_filter", $(this).val() ); + putMessage("Changed setting to "+$(this).val() ); + }); + + $(document).on('focus',".local_instance_wrap input[name='local_instance']", function(e) { + $(this).attr("placeholder","https://"+current_instance); + }); + + $(document).on('change',".local_instance_wrap input[name='local_instance']", function(e) { + if ( $(this).val() ) { + localStorage.setItem("setting_local_instance", $(this).val() ); + } else { + localStorage.setItem("setting_local_instance", "default" ); + } + putMessage("Changed setting to "+$(this).val() ); + }); + +}) + +/*---------------------------------- + Keyboard shortcut +-----------------------------------*/ + +$(function() { + + shortcut.add("n",function() { + $("#creat_status").click(); + },{ + "disable_in_input":true, + }); + + shortcut.add("/",function() { + $("#search_form").focus(); + },{ + "disable_in_input":true, + 'keycode':191 + }); + + shortcut.add("Meta+Enter",function() { + $(".active_submit_button").click(); + }); + + shortcut.add("Ctrl+Enter",function() { + $(".active_submit_button").click(); + }); + + shortcut.add(".",function() { + $("#js-stream_update").click(); + },{ + "disable_in_input":true, + }); + + shortcut.add("Shift+h",function() { + location.href="/home"; + },{ + "disable_in_input":true, + }); + + shortcut.add("Shift+l",function() { + location.href="/local"; + },{ + "disable_in_input":true, + }); + + shortcut.add("Shift+f",function() { + location.href="/federated"; + },{ + "disable_in_input":true, + }); + + shortcut.add("Shift+n",function() { + location.href="/notifications"; + },{ + "disable_in_input":true, + }); + + shortcut.add("Shift+p",function() { + location.href=current_url; + },{ + "disable_in_input":true, + }); + + shortcut.add("Shift+v",function() { + location.href=current_favourites_link; + },{ + "disable_in_input":true, + }); + + shortcut.add("esc",function() { + $("#js-overlay_content_wrap").click(); + }); + +}); + +/*---------------------------------- + Yamada elf +----------------------------------*/ + +function setYaruki() { + $('.toot_entry_body .icon_box img').attr('src','/assets/images/elf.jpg') + $('.toot_content .displayname').text('山田エルフ'); + $('.toot_content .username').text('©KADOKAWA©ASCIIMediaWorks'); + putMessage('やる気MAXファイアー!'); + /* this is a joke function */ +} diff --git a/public_html/assets/js/jquery-cookie/.DS_Store b/public_html/assets/js/jquery-cookie/.DS_Store new file mode 100644 index 0000000..d655808 Binary files /dev/null and b/public_html/assets/js/jquery-cookie/.DS_Store differ diff --git a/public_html/assets/js/jquery-cookie/CHANGELOG.md b/public_html/assets/js/jquery-cookie/CHANGELOG.md new file mode 100644 index 0000000..59d868f --- /dev/null +++ b/public_html/assets/js/jquery-cookie/CHANGELOG.md @@ -0,0 +1,73 @@ +HEAD +----- + +1.4.1 +----- +- Added support for CommonJS. + +- Added support for package managers: Jam (http://jamjs.org), volo (http://volojs.org), Component (http://component.io), jspm (http://jspm.io). + +- The expires option now interpretes fractions of numbers (e.g. days) correctly. + +1.4.0 +----- +- Support for AMD. + +- Removed deprecated method `$.cookie('name', null)` for deleting a cookie, + use `$.removeCookie('name')`. + +- `$.cookie('name')` now returns `undefined` in case such cookie does not exist + (was `null`). Because the return value is still falsy, testing for existence + of a cookie like `if ( $.cookie('foo') )` keeps working without change. + +- Renamed bower package definition (component.json -> bower.json) for usage + with up-to-date bower. + +- Badly encoded cookies no longer throw exception upon reading but do return + undefined (similar to how we handle JSON parse errors with json = true). + +- Added conversion function as optional last argument for reading, + so that values can be changed to a different representation easily on the fly. + Useful for parsing numbers for instance: + + ```javascript + $.cookie('foo', '42'); + $.cookie('foo', Number); // => 42 + ``` + +1.3.1 +----- +- Fixed issue where it was no longer possible to check for an arbitrary cookie, + while json is set to true, there was a SyntaxError thrown from JSON.parse. + +- Fixed issue where RFC 2068 decoded cookies were not properly read. + +1.3.0 +----- +- Configuration options: `raw`, `json`. Replaces raw option, becomes config: + + ```javascript + $.cookie.raw = true; // bypass encoding/decoding the cookie value + $.cookie.json = true; // automatically JSON stringify/parse value + ``` + + Thus the default options now cleanly contain cookie attributes only. + +- Removing licensing under GPL Version 2, the plugin is now released under MIT License only +(keeping it simple and following the jQuery library itself here). + +- Bugfix: Properly handle RFC 2068 quoted cookie values. + +- Added component.json for bower. + +- Added jQuery plugin package manifest. + +- `$.cookie()` returns all available cookies. + +1.2.0 +----- +- Adding `$.removeCookie('foo')` for deleting a cookie, using `$.cookie('foo', null)` is now deprecated. + +1.1 +--- +- Adding default options. diff --git a/public_html/assets/js/jquery-cookie/CONTRIBUTING.md b/public_html/assets/js/jquery-cookie/CONTRIBUTING.md new file mode 100644 index 0000000..608c33e --- /dev/null +++ b/public_html/assets/js/jquery-cookie/CONTRIBUTING.md @@ -0,0 +1,51 @@ +##Issues + +- Report issues or feature requests on [GitHub Issues](https://github.com/carhartl/jquery-cookie/issues). +- If reporting a bug, please add a [simplified example](http://sscce.org/). + +##Pull requests +- Create a new topic branch for every separate change you make. +- Create a test case if you are fixing a bug or implementing an important feature. +- Make sure the build runs successfully. + +## Development + +###Tools +We use the following tools for development: + +- [Qunit](http://qunitjs.com/) for tests. +- [NodeJS](http://nodejs.org/download/) required to run grunt. +- [Grunt](http://gruntjs.com/getting-started) for task management. + +###Getting started +Install [NodeJS](http://nodejs.org/). +Install globally grunt-cli using the following command: + + $ npm install -g grunt-cli + +Browse to the project root directory and install the dev dependencies: + + $ npm install -d + +To execute the build and tests run the following command in the root of the project: + + $ grunt + +You should see a green message in the console: + + Done, without errors. + +###Tests +You can also run the tests in the browser. +Start a test server from the project root: + + $ grunt connect:tests + +This will automatically open the test suite at http://127.0.0.1:9998 in the default browser, with livereload enabled. + +_Note: we recommend cleaning all the browser cookies before running the tests, that can avoid false positive failures._ + +###Automatic build +You can build automatically after a file change using the following command: + + $ grunt watch diff --git a/public_html/assets/js/jquery-cookie/Gruntfile.js b/public_html/assets/js/jquery-cookie/Gruntfile.js new file mode 100644 index 0000000..5ac9db5 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/Gruntfile.js @@ -0,0 +1,168 @@ +/*jshint node:true, quotmark:single */ +'use strict'; + +module.exports = function (grunt) { + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + qunit: { + all: 'test/index.html' + }, + jshint: { + options: { + jshintrc: true + }, + grunt: 'Gruntfile.js', + source: 'src/**/*.js', + tests: 'test/**/*.js' + }, + uglify: { + options: { + banner: '/*! <%= pkg.name %> v<%= pkg.version %> | <%= pkg.license %> */\n' + }, + build: { + files: { + 'build/jquery.cookie-<%= pkg.version %>.min.js': 'src/jquery.cookie.js' + } + } + }, + watch: { + options: { + livereload: true + }, + files: '{src,test}/**/*.js', + tasks: 'default' + }, + compare_size: { + files: [ + 'build/jquery.cookie-<%= pkg.version %>.min.js', + 'src/jquery.cookie.js' + ], + options: { + compress: { + gz: function (fileContents) { + return require('gzip-js').zip(fileContents, {}).length; + } + } + } + }, + connect: { + saucelabs: { + options: { + port: 9999, + base: ['.', 'test'] + } + }, + tests: { + options: { + port: 9998, + base: ['.', 'test'], + open: 'http://127.0.0.1:9998', + keepalive: true, + livereload: true + } + } + }, + 'saucelabs-qunit': { + all: { + options: { + urls: ['http://127.0.0.1:9999'], + build: process.env.TRAVIS_JOB_ID, + browsers: [ + // iOS + { + browserName: 'iphone', + platform: 'OS X 10.9', + version: '7.1' + }, + { + browserName: 'ipad', + platform: 'OS X 10.9', + version: '7.1' + }, + // Android + { + browserName: 'android', + platform: 'Linux', + version: '4.3' + }, + // OS X + { + browserName: 'safari', + platform: 'OS X 10.9', + version: '7' + }, + { + browserName: 'safari', + platform: 'OS X 10.8', + version: '6' + }, + { + browserName: 'firefox', + platform: 'OS X 10.9', + version: '28' + }, + // Windows + { + browserName: 'internet explorer', + platform: 'Windows 8.1', + version: '11' + }, + { + browserName: 'internet explorer', + platform: 'Windows 8', + version: '10' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '11' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '10' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '9' + }, + { + browserName: 'internet explorer', + platform: 'Windows 7', + version: '8' + }, + { + browserName: 'firefox', + platform: 'Windows 7', + version: '29' + }, + { + browserName: 'chrome', + platform: 'Windows 7', + version: '34' + }, + // Linux + { + browserName: 'firefox', + platform: 'Linux', + version: '29' + } + ] + } + } + } + }); + + // Loading dependencies + for (var key in grunt.file.readJSON('package.json').devDependencies) { + if (key !== 'grunt' && key.indexOf('grunt') === 0) { + grunt.loadNpmTasks(key); + } + } + + grunt.registerTask('default', ['jshint', 'qunit', 'uglify', 'compare_size']); + grunt.registerTask('saucelabs', ['connect:saucelabs', 'saucelabs-qunit']); + grunt.registerTask('ci', ['jshint', 'qunit', 'saucelabs']); +}; diff --git a/public_html/assets/js/jquery-cookie/MIT-LICENSE.txt b/public_html/assets/js/jquery-cookie/MIT-LICENSE.txt new file mode 100644 index 0000000..7a631e8 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/MIT-LICENSE.txt @@ -0,0 +1,20 @@ +Copyright 2014 Klaus Hartl + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/public_html/assets/js/jquery-cookie/README.md b/public_html/assets/js/jquery-cookie/README.md new file mode 100644 index 0000000..3100800 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/README.md @@ -0,0 +1,162 @@ +# IMPORTANT! + +This project was moved to https://github.com/js-cookie/js-cookie, check [the discussion](https://github.com/carhartl/jquery-cookie/issues/349). + +New issues should be opened at https://github.com/js-cookie/js-cookie/issues + +# jquery.cookie [![Build Status](https://travis-ci.org/carhartl/jquery-cookie.png?branch=master)](https://travis-ci.org/carhartl/jquery-cookie) [![Code Climate](https://codeclimate.com/github/carhartl/jquery-cookie.png)](https://codeclimate.com/github/carhartl/jquery-cookie) + +A simple, lightweight jQuery plugin for reading, writing and deleting cookies. + +**If you're viewing this, you're reading the documentation for the old repository. +[View documentation for the latest backwards compatible release (1.5.1).](https://github.com/js-cookie/js-cookie/tree/v1.5.1)** + +## Build Status Matrix + +[![Selenium Test Status](https://saucelabs.com/browser-matrix/jquery-cookie.svg)](https://saucelabs.com/u/jquery-cookie) + +## Installation + +Include script *after* the jQuery library (unless you are packaging scripts somehow else): + +```html + +``` + +**Do not include the script directly from GitHub (http://raw.github.com/...).** The file is being served as text/plain and as such being blocked +in Internet Explorer on Windows 7 for instance (because of the wrong MIME type). Bottom line: GitHub is not a CDN. + +The plugin can also be loaded as AMD or CommonJS module. + +## Usage + +Create session cookie: + +```javascript +$.cookie('name', 'value'); +``` + +Create expiring cookie, 7 days from then: + +```javascript +$.cookie('name', 'value', { expires: 7 }); +``` + +Create expiring cookie, valid across entire site: + +```javascript +$.cookie('name', 'value', { expires: 7, path: '/' }); +``` + +Read cookie: + +```javascript +$.cookie('name'); // => "value" +$.cookie('nothing'); // => undefined +``` + +Read all available cookies: + +```javascript +$.cookie(); // => { "name": "value" } +``` + +Delete cookie: + +```javascript +// Returns true when cookie was successfully deleted, otherwise false +$.removeCookie('name'); // => true +$.removeCookie('nothing'); // => false + +// Need to use the same attributes (path, domain) as what the cookie was written with +$.cookie('name', 'value', { path: '/' }); +// This won't work! +$.removeCookie('name'); // => false +// This will work! +$.removeCookie('name', { path: '/' }); // => true +``` + +*Note: when deleting a cookie, you must pass the exact same path, domain and secure options that were used to set the cookie, unless you're relying on the default options that is.* + +## Configuration + +### raw + +By default the cookie value is encoded/decoded when writing/reading, using `encodeURIComponent`/`decodeURIComponent`. Bypass this by setting raw to true: + +```javascript +$.cookie.raw = true; +``` + +### json + +Turn on automatic storage of JSON objects passed as the cookie value. Assumes `JSON.stringify` and `JSON.parse`: + +```javascript +$.cookie.json = true; +``` + +## Cookie Options + +Cookie attributes can be set globally by setting properties of the `$.cookie.defaults` object or individually for each call to `$.cookie()` by passing a plain object to the options argument. Per-call options override the default options. + +### expires + + expires: 365 + +Define lifetime of the cookie. Value can be a `Number` which will be interpreted as days from time of creation or a `Date` object. If omitted, the cookie becomes a session cookie. + +### path + + path: '/' + +Define the path where the cookie is valid. *By default the path of the cookie is the path of the page where the cookie was created (standard browser behavior).* If you want to make it available for instance across the entire domain use `path: '/'`. Default: path of page where the cookie was created. + +**Note regarding Internet Explorer:** + +> Due to an obscure bug in the underlying WinINET InternetGetCookie implementation, IE’s document.cookie will not return a cookie if it was set with a path attribute containing a filename. + +(From [Internet Explorer Cookie Internals (FAQ)](http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx)) + +This means one cannot set a path using `path: window.location.pathname` in case such pathname contains a filename like so: `/check.html` (or at least, such cookie cannot be read correctly). + +### domain + + domain: 'example.com' + +Define the domain where the cookie is valid. Default: domain of page where the cookie was created. + +### secure + + secure: true + +If true, the cookie transmission requires a secure protocol (https). Default: `false`. + +## Converters + +Provide a conversion function as optional last argument for reading, in order to change the cookie's value +to a different representation on the fly. + +Example for parsing a value into a number: + +```javascript +$.cookie('foo', '42'); +$.cookie('foo', Number); // => 42 +``` + +Dealing with cookies that have been encoded using `escape` (3rd party cookies): + +```javascript +$.cookie.raw = true; +$.cookie('foo', unescape); +``` + +You can pass an arbitrary conversion function. + +## Contributing + +Check out the [Contributing Guidelines](CONTRIBUTING.md) + +## Authors + +[Klaus Hartl](https://github.com/carhartl) diff --git a/public_html/assets/js/jquery-cookie/bower.json b/public_html/assets/js/jquery-cookie/bower.json new file mode 100644 index 0000000..3862b74 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/bower.json @@ -0,0 +1,18 @@ +{ + "name": "jquery.cookie", + "version": "1.4.1", + "main": [ + "src/jquery.cookie.js" + ], + "dependencies": { + "jquery": ">=1.2" + }, + "ignore": [ + "test", + ".*", + "*.json", + "*.md", + "*.txt", + "Gruntfile.js" + ] +} diff --git a/public_html/assets/js/jquery-cookie/component.json b/public_html/assets/js/jquery-cookie/component.json new file mode 100644 index 0000000..0fad480 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/component.json @@ -0,0 +1,14 @@ +{ + "name": "jquery.cookie", + "repo": "carhartl/jquery-cookie", + "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies", + "version": "1.4.1", + "keywords": [], + "dependencies": {}, + "development": {}, + "license": "MIT", + "main": "src/jquery.cookie.js", + "scripts": [ + "src/jquery.cookie.js" + ] +} diff --git a/public_html/assets/js/jquery-cookie/cookie.jquery.json b/public_html/assets/js/jquery-cookie/cookie.jquery.json new file mode 100644 index 0000000..69d5748 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/cookie.jquery.json @@ -0,0 +1,32 @@ +{ + "name": "cookie", + "version": "1.4.1", + "title": "jQuery Cookie", + "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.", + "author": { + "name": "Klaus Hartl", + "url": "https://github.com/carhartl" + }, + "maintainers": [ + { + "name": "Klaus Hartl", + "url": "https://github.com/carhartl" + }, + { + "name": "Fagner Martins", + "url": "https://github.com/FagnerMartinsBrack" + } + ], + "licenses": [ + { + "type": "MIT", + "url": "https://raw.github.com/carhartl/jquery-cookie/master/MIT-LICENSE.txt" + } + ], + "dependencies": { + "jquery": ">=1.2" + }, + "bugs": "https://github.com/carhartl/jquery-cookie/issues", + "homepage": "https://github.com/carhartl/jquery-cookie", + "docs": "https://github.com/carhartl/jquery-cookie#readme" +} diff --git a/public_html/assets/js/jquery-cookie/package.json b/public_html/assets/js/jquery-cookie/package.json new file mode 100644 index 0000000..38abffe --- /dev/null +++ b/public_html/assets/js/jquery-cookie/package.json @@ -0,0 +1,50 @@ +{ + "name": "jquery.cookie", + "version": "1.4.1", + "description": "A simple, lightweight jQuery plugin for reading, writing and deleting cookies.", + "main": "src/jquery.cookie.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "grunt" + }, + "repository": { + "type": "git", + "url": "git://github.com/carhartl/jquery-cookie.git" + }, + "author": "Klaus Hartl", + "license": "MIT", + "gitHead": "bd3c9713222bace68d25fe2128c0f8633cad1269", + "readmeFilename": "README.md", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.10.0", + "grunt-contrib-uglify": "~0.2.0", + "grunt-contrib-qunit": "~0.2.0", + "grunt-contrib-watch": "~0.6.1", + "grunt-compare-size": "~0.4.0", + "grunt-saucelabs": "~7.0.0", + "grunt-contrib-connect": "~0.7.1", + "gzip-js": "~0.3.0" + }, + "volo": { + "url": "https://raw.github.com/carhartl/jquery-cookie/v{version}/src/jquery.cookie.js" + }, + "jspm": { + "main": "jquery.cookie", + "files": ["src/jquery.cookie.js"], + "buildConfig": { + "uglify": true + } + }, + "jam": { + "dependencies": { + "jquery": ">=1.2" + }, + "main": "src/jquery.cookie.js", + "include": [ + "src/jquery.cookie.js" + ] + } +} diff --git a/public_html/assets/js/jquery-cookie/src/.jshintrc b/public_html/assets/js/jquery-cookie/src/.jshintrc new file mode 100644 index 0000000..241dd9f --- /dev/null +++ b/public_html/assets/js/jquery-cookie/src/.jshintrc @@ -0,0 +1,13 @@ +{ + "browser": true, + "camelcase": true, + "jquery": true, + "quotmark": "single", + "globals": { + "define": true, + "module": true, + "require": true + }, + + "extends": "../.jshintrc" +} diff --git a/public_html/assets/js/jquery-cookie/src/jquery.cookie.js b/public_html/assets/js/jquery-cookie/src/jquery.cookie.js new file mode 100644 index 0000000..8218817 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/src/jquery.cookie.js @@ -0,0 +1,114 @@ +/*! + * jQuery Cookie Plugin v1.4.1 + * https://github.com/carhartl/jquery-cookie + * + * Copyright 2006, 2014 Klaus Hartl + * Released under the MIT license + */ +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD (Register as an anonymous module) + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + module.exports = factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + + var pluses = /\+/g; + + function encode(s) { + return config.raw ? s : encodeURIComponent(s); + } + + function decode(s) { + return config.raw ? s : decodeURIComponent(s); + } + + function stringifyCookieValue(value) { + return encode(config.json ? JSON.stringify(value) : String(value)); + } + + function parseCookieValue(s) { + if (s.indexOf('"') === 0) { + // This is a quoted cookie as according to RFC2068, unescape... + s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); + } + + try { + // Replace server-side written pluses with spaces. + // If we can't decode the cookie, ignore it, it's unusable. + // If we can't parse the cookie, ignore it, it's unusable. + s = decodeURIComponent(s.replace(pluses, ' ')); + return config.json ? JSON.parse(s) : s; + } catch(e) {} + } + + function read(s, converter) { + var value = config.raw ? s : parseCookieValue(s); + return $.isFunction(converter) ? converter(value) : value; + } + + var config = $.cookie = function (key, value, options) { + + // Write + + if (arguments.length > 1 && !$.isFunction(value)) { + options = $.extend({}, config.defaults, options); + + if (typeof options.expires === 'number') { + var days = options.expires, t = options.expires = new Date(); + t.setMilliseconds(t.getMilliseconds() + days * 864e+5); + } + + return (document.cookie = [ + encode(key), '=', stringifyCookieValue(value), + options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE + options.path ? '; path=' + options.path : '', + options.domain ? '; domain=' + options.domain : '', + options.secure ? '; secure' : '' + ].join('')); + } + + // Read + + var result = key ? undefined : {}, + // To prevent the for loop in the first place assign an empty array + // in case there are no cookies at all. Also prevents odd result when + // calling $.cookie(). + cookies = document.cookie ? document.cookie.split('; ') : [], + i = 0, + l = cookies.length; + + for (; i < l; i++) { + var parts = cookies[i].split('='), + name = decode(parts.shift()), + cookie = parts.join('='); + + if (key === name) { + // If second argument (value) is a function it's a converter... + result = read(cookie, value); + break; + } + + // Prevent storing a cookie that we couldn't decode. + if (!key && (cookie = read(cookie)) !== undefined) { + result[name] = cookie; + } + } + + return result; + }; + + config.defaults = {}; + + $.removeCookie = function (key, options) { + // Must not alter options, thus extending a fresh object... + $.cookie(key, '', $.extend({}, options, { expires: -1 })); + return !$.cookie(key); + }; + +})); diff --git a/public_html/assets/js/jquery-cookie/test/.jshintrc b/public_html/assets/js/jquery-cookie/test/.jshintrc new file mode 100644 index 0000000..bc52b0a --- /dev/null +++ b/public_html/assets/js/jquery-cookie/test/.jshintrc @@ -0,0 +1,9 @@ +{ + "browser": true, + "jquery": true, + "qunit": true, + + "-W053": true, + + "extends": "../.jshintrc" +} diff --git a/public_html/assets/js/jquery-cookie/test/index.html b/public_html/assets/js/jquery-cookie/test/index.html new file mode 100644 index 0000000..ade6830 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/test/index.html @@ -0,0 +1,16 @@ + + + + + jquery.cookie Test Suite + + + + + + + +
    +
    + + diff --git a/public_html/assets/js/jquery-cookie/test/malformed_cookie.html b/public_html/assets/js/jquery-cookie/test/malformed_cookie.html new file mode 100644 index 0000000..74178d4 --- /dev/null +++ b/public_html/assets/js/jquery-cookie/test/malformed_cookie.html @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/public_html/assets/js/jquery-cookie/test/tests.js b/public_html/assets/js/jquery-cookie/test/tests.js new file mode 100644 index 0000000..68b47cc --- /dev/null +++ b/public_html/assets/js/jquery-cookie/test/tests.js @@ -0,0 +1,345 @@ +// Required for exposing test results to the Sauce Labs API. +// Can be removed when the following issue is fixed: +// https://github.com/axemclion/grunt-saucelabs/issues/84 +QUnit.done(function (details) { + window.global_test_results = details; +}); + + +var lifecycle = { + teardown: function () { + $.cookie.defaults = {}; + delete $.cookie.raw; + delete $.cookie.json; + $.each($.cookie(), $.removeCookie); + } +}; + + +module('read', lifecycle); + +test('simple value', function () { + expect(1); + document.cookie = 'c=v'; + strictEqual($.cookie('c'), 'v', 'should return value'); +}); + +test('empty value', function () { + expect(1); + // IE saves cookies with empty string as "c; ", e.g. without "=" as opposed to EOMB, which + // resulted in a bug while reading such a cookie. + $.cookie('c', ''); + strictEqual($.cookie('c'), '', 'should return value'); +}); + +test('not existing', function () { + expect(1); + strictEqual($.cookie('whatever'), undefined, 'return undefined'); +}); + +test('RFC 2068 quoted string', function () { + expect(1); + document.cookie = 'c="v@address.com\\"\\\\\\""'; + strictEqual($.cookie('c'), 'v@address.com"\\"', 'should decode RFC 2068 quoted string'); +}); + +test('decode', function () { + expect(1); + document.cookie = encodeURIComponent(' c') + '=' + encodeURIComponent(' v'); + strictEqual($.cookie(' c'), ' v', 'should decode key and value'); +}); + +test('decode pluses to space for server side written cookie', function () { + expect(1); + document.cookie = 'c=foo+bar'; + strictEqual($.cookie('c'), 'foo bar', 'should convert pluses back to space'); +}); + +test('raw = true', function () { + expect(2); + $.cookie.raw = true; + + document.cookie = 'c=%20v'; + strictEqual($.cookie('c'), '%20v', 'should not decode value'); + + // see https://github.com/carhartl/jquery-cookie/issues/50 + $.cookie('c', 'foo=bar'); + strictEqual($.cookie('c'), 'foo=bar', 'should include the entire value'); +}); + +test('json = true', function () { + expect(1); + + if ('JSON' in window) { + $.cookie.json = true; + $.cookie('c', { foo: 'bar' }); + deepEqual($.cookie('c'), { foo: 'bar' }, 'should parse JSON'); + } else { + ok(true); + } +}); + +test('not existing with json = true', function () { + expect(1); + + if ('JSON' in window) { + $.cookie.json = true; + strictEqual($.cookie('whatever'), undefined, "won't throw exception"); + } else { + ok(true); + } +}); + +test('string with json = true', function () { + expect(1); + + if ('JSON' in window) { + $.cookie.json = true; + $.cookie('c', 'v'); + strictEqual($.cookie('c'), 'v', 'should return value'); + } else { + ok(true); + } +}); + +test('invalid JSON string with json = true', function () { + expect(1); + + if ('JSON' in window) { + $.cookie('c', 'v'); + $.cookie.json = true; + strictEqual($.cookie('c'), undefined, "won't throw exception, returns undefined"); + } else { + ok(true); + } +}); + +test('invalid URL encoding', function () { + expect(1); + document.cookie = 'bad=foo%'; + strictEqual($.cookie('bad'), undefined, "won't throw exception, returns undefined"); + // Delete manually here because it requires raw === true... + $.cookie.raw = true; + $.removeCookie('bad'); +}); + +asyncTest('malformed cookie value in IE (#88, #117)', function () { + expect(1); + // Sandbox in an iframe so that we can poke around with document.cookie. + var iframe = $('')[0]; + $(iframe).on('load', function () { + start(); + if (iframe.contentWindow.ok) { + strictEqual(iframe.contentWindow.testValue, 'two', 'reads all cookie values, skipping duplicate occurences of "; "'); + } else { + // Skip the test where we can't stub document.cookie using + // Object.defineProperty. Seems to work fine in + // Chrome, Firefox and IE 8+. + ok(true, 'N/A'); + } + }); + document.body.appendChild(iframe); +}); + +test('Call to read all when there are cookies', function () { + $.cookie('c', 'v'); + $.cookie('foo', 'bar'); + deepEqual($.cookie(), { c: 'v', foo: 'bar' }, 'returns object containing all cookies'); +}); + +test('Call to read all when there are no cookies at all', function () { + deepEqual($.cookie(), {}, 'returns empty object'); +}); + +test('Call to read all with json: true', function () { + $.cookie.json = true; + $.cookie('c', { foo: 'bar' }); + deepEqual($.cookie(), { c: { foo: 'bar' } }, 'returns JSON parsed cookies'); +}); + +test('Call to read all with a badly encoded cookie', function () { + expect(1); + document.cookie = 'bad=foo%'; + document.cookie = 'good=foo'; + deepEqual($.cookie(), { good: 'foo' }, 'returns object containing all decodable cookies'); + // Delete manually here because it requires raw === true... + $.cookie.raw = true; + $.removeCookie('bad'); +}); + + +module('write', lifecycle); + +test('String primitive', function () { + expect(1); + $.cookie('c', 'v'); + strictEqual($.cookie('c'), 'v', 'should write value'); +}); + +test('String object', function () { + expect(1); + $.cookie('c', new String('v')); + strictEqual($.cookie('c'), 'v', 'should write value'); +}); + +test('value "[object Object]"', function () { + expect(1); + $.cookie('c', '[object Object]'); + strictEqual($.cookie('c'), '[object Object]', 'should write value'); +}); + +test('number', function () { + expect(1); + $.cookie('c', 1234); + strictEqual($.cookie('c'), '1234', 'should write value'); +}); + +test('null', function () { + expect(1); + $.cookie('c', null); + strictEqual($.cookie('c'), 'null', 'should write value'); +}); + +test('undefined', function () { + expect(1); + $.cookie('c', undefined); + strictEqual($.cookie('c'), 'undefined', 'should write value'); +}); + +test('expires option as days from now', function () { + expect(1); + var sevenDaysFromNow = new Date(); + sevenDaysFromNow.setDate(sevenDaysFromNow.getDate() + 21); + strictEqual($.cookie('c', 'v', { expires: 21 }), 'c=v; expires=' + sevenDaysFromNow.toUTCString(), + 'should write the cookie string with expires'); +}); + +test('expires option as fraction of a day', function () { + expect(1); + + var now = new Date().getTime(); + var expires = Date.parse($.cookie('c', 'v', { expires: 0.5 }).replace(/.+expires=/, '')); + + // When we were using Date.setDate() fractions have been ignored + // and expires resulted in the current date. Allow 1000 milliseconds + // difference for execution time. + ok(expires > now + 1000, 'should write expires attribute with the correct date'); +}); + +test('expires option as Date instance', function () { + expect(1); + var sevenDaysFromNow = new Date(); + sevenDaysFromNow.setDate(sevenDaysFromNow.getDate() + 7); + strictEqual($.cookie('c', 'v', { expires: sevenDaysFromNow }), 'c=v; expires=' + sevenDaysFromNow.toUTCString(), + 'should write the cookie string with expires'); +}); + +test('return value', function () { + expect(1); + strictEqual($.cookie('c', 'v'), 'c=v', 'should return written cookie string'); +}); + +test('defaults', function () { + expect(2); + $.cookie.defaults.path = '/foo'; + ok($.cookie('c', 'v').match(/path=\/foo/), 'should use options from defaults'); + ok($.cookie('c', 'v', { path: '/bar' }).match(/path=\/bar/), 'options argument has precedence'); +}); + +test('raw = true', function () { + expect(1); + $.cookie.raw = true; + strictEqual($.cookie('c[1]', 'v[1]'), 'c[1]=v[1]', 'should not encode'); + // Delete manually here because it requires raw === true... + $.removeCookie('c[1]'); +}); + +test('json = true', function () { + expect(1); + $.cookie.json = true; + + if ('JSON' in window) { + $.cookie('c', { foo: 'bar' }); + strictEqual(document.cookie, 'c=' + encodeURIComponent(JSON.stringify({ foo: 'bar' })), 'should stringify JSON'); + } else { + ok(true); + } +}); + + +module('removeCookie', lifecycle); + +test('deletion', function () { + expect(1); + $.cookie('c', 'v'); + $.removeCookie('c'); + strictEqual(document.cookie, '', 'should delete the cookie'); +}); + +test('when sucessfully deleted', function () { + expect(1); + $.cookie('c', 'v'); + strictEqual($.removeCookie('c'), true, 'returns true'); +}); + +test('when cookie does not exist', function () { + expect(1); + strictEqual($.removeCookie('c'), true, 'returns true'); +}); + +test('when deletion failed', function () { + expect(1); + $.cookie('c', 'v'); + + var originalCookie = $.cookie; + $.cookie = function () { + // Stub deletion... + if (arguments.length === 1) { + return originalCookie.apply(null, arguments); + } + }; + + strictEqual($.removeCookie('c'), false, 'returns false'); + + $.cookie = originalCookie; +}); + +test('with options', function () { + expect(1); + var options = { path: '/' }; + $.cookie('c', 'v', options); + $.removeCookie('c', options); + strictEqual(document.cookie, '', 'should delete the cookie'); +}); + +test('passing options reference', function () { + expect(1); + var options = { path: '/' }; + $.cookie('c', 'v', options); + $.removeCookie('c', options); + deepEqual(options, { path: '/' }, "won't alter options object"); +}); + +test('[] used in name', function () { + expect(1); + $.cookie.raw = true; + document.cookie = 'c[1]=foo'; + $.removeCookie('c[1]'); + strictEqual(document.cookie, '', 'delete the cookie'); +}); + + +module('conversion', lifecycle); + +test('read converter', function() { + expect(1); + $.cookie('c', '1'); + strictEqual($.cookie('c', Number), 1, 'converts read value'); +}); + +test('read converter with raw = true', function() { + expect(1); + $.cookie.raw = true; + $.cookie('c', '1'); + strictEqual($.cookie('c', Number), 1, 'does not decode, but converts read value'); +}); diff --git a/public_html/assets/js/mastodon.js/.DS_Store b/public_html/assets/js/mastodon.js/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/public_html/assets/js/mastodon.js/.DS_Store differ diff --git a/public_html/assets/js/mastodon.js/LICENSE b/public_html/assets/js/mastodon.js/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/public_html/assets/js/mastodon.js/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/public_html/assets/js/mastodon.js/README b/public_html/assets/js/mastodon.js/README new file mode 100644 index 0000000..43c1553 --- /dev/null +++ b/public_html/assets/js/mastodon.js/README @@ -0,0 +1,3 @@ +Javascript Mastodon API Client Library for Browser Clients + +Check out index.html for a "how-to" \ No newline at end of file diff --git a/public_html/assets/js/mastodon.js/index.html b/public_html/assets/js/mastodon.js/index.html new file mode 100644 index 0000000..76d7668 --- /dev/null +++ b/public_html/assets/js/mastodon.js/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public_html/assets/js/mastodon.js/mastodon.js b/public_html/assets/js/mastodon.js/mastodon.js new file mode 100644 index 0000000..0745836 --- /dev/null +++ b/public_html/assets/js/mastodon.js/mastodon.js @@ -0,0 +1,277 @@ +// mastodon javascript lib +// by @kirschn@pleasehug.me 2017 +// no fucking copyright +// do whatever you want with it +// but please don't hurt it (and keep this header) + +var MastodonAPI = function(config) { + var apiBase = config.instance + "/api/v1/"; + return { + setConfig: function (key, value) { + // modify initial config afterwards + config[key] = value; + }, + getConfig: function(key) { + //get config key + return config[key]; + }, + get: function (endpoint) { + // for GET API calls + // can be called with two or three parameters + // endpoint, callback + // or + // endpoint, queryData, callback + // where querydata is an object {["paramname1", "paramvalue1], ["paramname2","paramvalue2"]} + + // variables + var queryData, callback, + queryStringAppend = "?"; + + // check with which arguments we're supplied + if (typeof arguments[1] === "function") { + queryData = {}; + callback = arguments[1]; + } else { + queryData = arguments[1]; + callback = arguments[2]; + } + // build queryData Object into a URL Query String + for (var i in queryData) { + if (queryData.hasOwnProperty(i)) { + if (typeof queryData[i] === "string") { + queryStringAppend += queryData[i] + "&"; + } else if (typeof queryData[i] === "object") { + queryStringAppend += queryData[i].name + "="+ queryData[i].data + "&"; + } + } + } + // ajax function + $.ajax({ + url: apiBase + endpoint + queryStringAppend, + type: "GET", + headers: {"Authorization": "Bearer " + config.api_user_token}, + success: function(data, textStatus, xhr) { + + //weeey it was successful + console.log("Successful GET API request to " +apiBase+endpoint); + responce_headers = xhr.getAllResponseHeaders(); + + //aaand start the callback + //might have to check what "textStatus" actually is, jquery docs are a bit dodgy + callback(data,textStatus); + }, + error: function(xhr, textStatus, errorThrown) { + putMessage(`[${xhr.status}] ${xhr.responseJSON['error']}`); + if ( xhr.status === 401 ) { + location.href = "/logout" + } + } + }); + }, + getArray: function (endpoint) { + // for GET API calls + // can be called with two or three parameters + // endpoint, callback + // or + // endpoint, queryData, callback + // where querydata is an object {["paramname1", "paramvalue1], ["paramname2","paramvalue2"]} + + // variables + var queryData, callback, + queryStringAppend = "?"; + + // check with which arguments we're supplied + if (typeof arguments[1] === "function") { + queryData = {}; + callback = arguments[1]; + } else { + queryData = arguments[1]; + callback = arguments[2]; + } + // build queryData Object into a URL Query String + for (var i in queryData) { + if (queryData.hasOwnProperty(i)) { + if (typeof queryData[i] === "string") { + queryStringAppend += queryData[i] + "&"; + } else if (typeof queryData[i] === "object") { + for ( var j in queryData[i].data ){ + queryStringAppend += queryData[i].name + "[]="+ queryData[i].data[j] + "&"; + } + } + } + } + // ajax function + $.ajax({ + url: apiBase + endpoint + queryStringAppend, + type: "GET", + headers: {"Authorization": "Bearer " + config.api_user_token}, + success: function(data, textStatus, xhr) { + + //weeey it was successful + console.log("Successful GET API request to " +apiBase+endpoint); + responce_headers = xhr.getAllResponseHeaders(); + + //aaand start the callback + //might have to check what "textStatus" actually is, jquery docs are a bit dodgy + callback(data,textStatus); + }, + error: function(xhr, textStatus, errorThrown) { + putMessage(`[${xhr.status}] ${xhr.responseJSON['error']}`); + if ( xhr.status === 401 ) { + location.href = "/logout" + } + } + }); + }, + getOther: function (domainAndEndpoint) { + + var queryData, callback, + queryStringAppend = "?"; + + // check with which arguments we're supplied + if (typeof arguments[1] === "function") { + queryData = {}; + callback = arguments[1]; + } else { + queryData = arguments[1]; + callback = arguments[2]; + } + // build queryData Object into a URL Query String + for (var i in queryData) { + if (queryData.hasOwnProperty(i)) { + if (typeof queryData[i] === "string") { + queryStringAppend += queryData[i] + "&"; + } else if (typeof queryData[i] === "object") { + queryStringAppend += queryData[i].name + "="+ queryData[i].data + "&"; + } + } + } + // ajax function + $.ajax({ + url: domainAndEndpoint + queryStringAppend, + type: "GET", + success: function(data, textStatus, xhr) { + + //weeey it was successful + console.log("Successful GET API request to " +domainAndEndpoint); + responce_headers = xhr.getAllResponseHeaders(); + + //aaand start the callback + //might have to check what "textStatus" actually is, jquery docs are a bit dodgy + callback(data,textStatus); + }, + error: function(xhr, textStatus, errorThrown) { + putMessage(`[${xhr.status}] ${xhr.responseJSON['error']}`); + if ( xhr.status === 401 ) { + location.href = "/logout" + } + } + }); + }, + post: function (endpoint) { + // for POST API calls + var postData, callback; + // check with which arguments we're supplied + if (typeof arguments[1] === "function") { + postData = {}; + callback = arguments[1]; + } else { + postData = arguments[1]; + callback = arguments[2]; + } + $.ajax({ + url: apiBase + endpoint, + type: "POST", + data: postData, + headers: {"Authorization": "Bearer " + config.api_user_token}, + success: function(data, textStatus) { + console.log("Successful POST API request to " +apiBase+endpoint); + callback(data,textStatus) + }, + error: function(xhr, textStatus, errorThrown) { + putMessage(`[${xhr.status}] ${xhr.responseJSON['error']}`); + if ( xhr.status === 401 ) { + location.href = "/logout" + } + } + }); + }, + postMedia: function (endpoint) { + + // for POST API calls + var postData, callback; + // check with which arguments we're supplied + if (typeof arguments[1] === "function") { + postData = {}; + callback = arguments[1]; + } else { + postData = arguments[1]; + callback = arguments[2]; + } + + $.ajax({ + url: apiBase + endpoint, + type: "POST", + data: postData, + contentType: false, + processData: false, + headers: {"Authorization": "Bearer " + config.api_user_token}, + success: function(data, textStatus) { + console.log("Successful POST API request to " +apiBase+endpoint); + callback(data,textStatus) + }, + error: function(xhr, textStatus, errorThrown) { + putMessage(`[${xhr.status}] ${xhr.responseJSON['error']}`); + if ( xhr.status === 401 ) { + location.href = "/logout" + } + } + }); + + }, + delete: function (endpoint, callback) { + // for DELETE API calls. + $.ajax({ + url: apiBase + endpoint, + type: "DELETE", + headers: {"Authorization": "Bearer " + config.api_user_token}, + success: function(data, textStatus) { + console.log("Successful DELETE API request to " +apiBase+endpoint); + callback(data,textStatus) + }, + error: function(xhr, textStatus, errorThrown) { + putMessage(`[${xhr.status}] ${xhr.responseJSON['error']}`); + if ( xhr.status === 401 ) { + location.href = "/logout" + } + } + }); + }, + stream: function (streamType, onData) { + // Event Stream Support + // websocket streaming is undocumented. i had to reverse engineer the fucking web client. + // streamType is either + // user for your local home TL and notifications + // public for your federated TL + // public:local for your home TL + // hashtag&tag=fuckdonaldtrump for the stream of #fuckdonaldtrump + // callback gets called whenever new data ist recieved + // callback { event: (eventtype), payload: {mastodon object as described in the api docs} } + // eventtype could be notification (=notification) or update (= new toot in TL) + var es = new WebSocket("wss://" + apiBase.substr(8) + +"streaming?access_token=" + config.api_user_token + "&stream=" + streamType); + var listener = function (event) { + console.log("Got Data from Stream " + streamType); + event = JSON.parse(event.data); + event.payload = JSON.parse(event.payload); + onData(event); + }; + es.onmessage = listener; + + + } + }; +}; + +// node.js +if (typeof module !== 'undefined') { module.exports = MastodonAPI; }; diff --git a/public_html/assets/js/replace_emoji.js b/public_html/assets/js/replace_emoji.js new file mode 100644 index 0000000..a7980ca --- /dev/null +++ b/public_html/assets/js/replace_emoji.js @@ -0,0 +1,3475 @@ +const emoji_dict = { ":hash:": "#⃣", + ":zero:": "0⃣", + ":one:": "1⃣", + ":two:": "2⃣", + ":three:": "3⃣", + ":four:": "4⃣", + ":five:": "5⃣", + ":six:": "6⃣", + ":seven:": "7⃣", + ":eight:": "8⃣", + ":nine:": "9⃣", + ":copyright:": "©", + ":registered:": "®", + ":bangbang:": "‼", + ":interrobang:": "⁉", + ":tm:": "™", + ":information_source:": "ℹ", + ":left_right_arrow:": "↔", + ":arrow_up_down:": "↕", + ":arrow_upper_left:": "↖", + ":third_place:": "🥉", + ":third_place_medal:": "🥉", + ":arrow_upper_right:": "↗", + ":arrow_lower_right:": "↘", + ":arrow_lower_left:": "↙", + ":second_place:": "🥈", + ":second_place_medal:": "🥈", + ":leftwards_arrow_with_hook:": "↩", + ":arrow_right_hook:": "↪", + ":watch:": "⌚", + ":hourglass:": "⌛", + ":fast_forward:": "⏩", + ":rewind:": "⏪", + ":arrow_double_up:": "⏫", + ":arrow_double_down:": "⏬", + ":alarm_clock:": "⏰", + ":hourglass_flowing_sand:": "⏳", + ":m:": "Ⓜ", + ":black_small_square:": "▪", + ":white_small_square:": "▫", + ":arrow_forward:": "▶", + ":arrow_backward:": "◀", + ":white_medium_square:": "◻", + ":black_medium_square:": "◼", + ":white_medium_small_square:": "◽", + ":black_medium_small_square:": "◾", + ":sunny:": "☀", + ":cloud:": "☁", + ":telephone:": "☎", + ":ballot_box_with_check:": "☑", + ":umbrella:": "☔", + ":coffee:": "☕", + ":point_up:": "☝", + ":relaxed:": "☺", + ":aries:": "♈", + ":first_place:": "🥇", + ":first_place_medal:": "🥇", + ":taurus:": "♉", + ":fencer:": "🤺", + ":fencing:": "🤺", + ":gemini:": "♊", + ":cancer:": "♋", + ":goal:": "🥅", + ":goal_net:": "🥅", + ":leo:": "♌", + ":asterisk_symbol:": "*", + ":virgo:": "♍", + ":handball:": "🤾", + ":libra:": "♎", + ":regional_indicator_z:": "🇿", + ":water_polo:": "🤽", + ":scorpius:": "♏", + ":sagittarius:": "♐", + ":martial_arts_uniform:": "🥋", + ":karate_uniform:": "🥋", + ":capricorn:": "♑", + ":boxing_glove:": "🥊", + ":boxing_gloves:": "🥊", + ":aquarius:": "♒", + ":wrestlers:": "🤼", + ":wrestling:": "🤼", + ":pisces:": "♓", + ":spades:": "♠", + ":clubs:": "♣", + ":hearts:": "♥", + ":diamonds:": "♦", + ":hotsprings:": "♨", + ":recycle:": "♻", + ":juggling:": "🤹", + ":juggler:": "🤹", + ":wheelchair:": "♿", + ":anchor:": "⚓", + ":warning:": "⚠", + ":zap:": "⚡", + ":white_circle:": "⚪", + ":black_circle:": "⚫", + ":soccer:": "⚽", + ":baseball:": "⚾", + ":snowman:": "⛄", + ":partly_sunny:": "⛅", + ":ophiuchus:": "⛎", + ":cartwheel:": "🤸", + ":person_doing_cartwheel:": "🤸", + ":no_entry:": "⛔", + ":church:": "⛪", + ":fountain:": "⛲", + ":canoe:": "🛶", + ":kayak:": "🛶", + ":golf:": "⛳", + ":sailboat:": "⛵", + ":tent:": "⛺", + ":fuelpump:": "⛽", + ":scissors:": "✂", + ":white_check_mark:": "✅", + ":airplane:": "✈", + ":envelope:": "✉", + ":fist:": "✊", + ":raised_hand:": "✋", + ":v:": "✌", + ":pencil2:": "✏", + ":black_nib:": "✒", + ":heavy_check_mark:": "✔", + ":heavy_multiplication_x:": "✖", + ":sparkles:": "✨", + ":eight_spoked_asterisk:": "✳", + ":eight_pointed_black_star:": "✴", + ":snowflake:": "❄", + ":sparkle:": "❇", + ":x:": "❌", + ":negative_squared_cross_mark:": "❎", + ":question:": "❓", + ":grey_question:": "❔", + ":motor_scooter:": "🛵", + ":motorbike:": "🛵", + ":grey_exclamation:": "❕", + ":exclamation:": "❗", + ":heart:": "❤", + ":heavy_plus_sign:": "➕", + ":heavy_minus_sign:": "➖", + ":heavy_division_sign:": "➗", + ":arrow_right:": "➡", + ":curly_loop:": "➰", + ":arrow_heading_up:": "⤴", + ":arrow_heading_down:": "⤵", + ":arrow_left:": "⬅", + ":arrow_up:": "⬆", + ":scooter:": "🛴", + ":arrow_down:": "⬇", + ":black_large_square:": "⬛", + ":white_large_square:": "⬜", + ":star:": "⭐", + ":o:": "⭕", + ":wavy_dash:": "〰", + ":part_alternation_mark:": "〽", + ":congratulations:": "㊗", + ":shopping_cart:": "🛒", + ":shopping_trolley:": "🛒", + ":secret:": "㊙", + ":mahjong:": "🀄", + ":black_joker:": "🃏", + ":a:": "🅰", + ":b:": "🅱", + ":o2:": "🅾", + ":parking:": "🅿", + ":octagonal_sign:": "🛑", + ":stop_sign:": "🛑", + ":ab:": "🆎", + ":cl:": "🆑", + ":regional_indicator_y:": "🇾", + ":cool:": "🆒", + ":free:": "🆓", + ":id:": "🆔", + ":new:": "🆕", + ":ng:": "🆖", + ":ok:": "🆗", + ":sos:": "🆘", + ":spoon:": "🥄", + ":up:": "🆙", + ":vs:": "🆚", + ":flag_cn:": "🇨🇳", + ":cn:": "🇨🇳", + ":flag_de:": "🇩🇪", + ":de:": "🇩🇪", + ":flag_es:": "🇪🇸", + ":es:": "🇪🇸", + ":flag_fr:": "🇫🇷", + ":fr:": "🇫🇷", + ":flag_gb:": "🇬🇧", + ":gb:": "🇬🇧", + ":champagne_glass:": "🥂", + ":clinking_glass:": "🥂", + ":tumbler_glass:": "🥃", + ":whisky:": "🥃", + ":flag_it:": "🇮🇹", + ":it:": "🇮🇹", + ":flag_jp:": "🇯🇵", + ":jp:": "🇯🇵", + ":flag_kr:": "🇰🇷", + ":kr:": "🇰🇷", + ":flag_us:": "🇺🇸", + ":us:": "🇺🇸", + ":flag_ru:": "🇷🇺", + ":ru:": "🇷🇺", + ":koko:": "🈁", + ":sa:": "🈂", + ":u7121:": "🈚", + ":u6307:": "🈯", + ":stuffed_flatbread:": "🥙", + ":stuffed_pita:": "🥙", + ":u7981:": "🈲", + ":u7a7a:": "🈳", + ":u5408:": "🈴", + ":u6e80:": "🈵", + ":u6709:": "🈶", + ":shallow_pan_of_food:": "🥘", + ":paella:": "🥘", + ":u6708:": "🈷", + ":u7533:": "🈸", + ":u5272:": "🈹", + ":salad:": "🥗", + ":green_salad:": "🥗", + ":u55b6:": "🈺", + ":ideograph_advantage:": "🉐", + ":accept:": "🉑", + ":cyclone:": "🌀", + ":french_bread:": "🥖", + ":baguette_bread:": "🥖", + ":foggy:": "🌁", + ":closed_umbrella:": "🌂", + ":night_with_stars:": "🌃", + ":sunrise_over_mountains:": "🌄", + ":sunrise:": "🌅", + ":city_dusk:": "🌆", + ":carrot:": "🥕", + ":city_sunset:": "🌇", + ":city_sunrise:": "🌇", + ":rainbow:": "🌈", + ":potato:": "🥔", + ":bridge_at_night:": "🌉", + ":ocean:": "🌊", + ":volcano:": "🌋", + ":milky_way:": "🌌", + ":earth_asia:": "🌏", + ":new_moon:": "🌑", + ":bacon:": "🥓", + ":first_quarter_moon:": "🌓", + ":waxing_gibbous_moon:": "🌔", + ":full_moon:": "🌕", + ":crescent_moon:": "🌙", + ":first_quarter_moon_with_face:": "🌛", + ":star2:": "🌟", + ":cucumber:": "🥒", + ":stars:": "🌠", + ":chestnut:": "🌰", + ":avocado:": "🥑", + ":seedling:": "🌱", + ":palm_tree:": "🌴", + ":cactus:": "🌵", + ":tulip:": "🌷", + ":cherry_blossom:": "🌸", + ":rose:": "🌹", + ":hibiscus:": "🌺", + ":sunflower:": "🌻", + ":blossom:": "🌼", + ":corn:": "🌽", + ":croissant:": "🥐", + ":ear_of_rice:": "🌾", + ":herb:": "🌿", + ":four_leaf_clover:": "🍀", + ":maple_leaf:": "🍁", + ":fallen_leaf:": "🍂", + ":leaves:": "🍃", + ":mushroom:": "🍄", + ":tomato:": "🍅", + ":eggplant:": "🍆", + ":grapes:": "🍇", + ":melon:": "🍈", + ":watermelon:": "🍉", + ":tangerine:": "🍊", + ":wilted_rose:": "🥀", + ":wilted_flower:": "🥀", + ":banana:": "🍌", + ":pineapple:": "🍍", + ":apple:": "🍎", + ":green_apple:": "🍏", + ":peach:": "🍑", + ":cherries:": "🍒", + ":strawberry:": "🍓", + ":rhino:": "🦏", + ":rhinoceros:": "🦏", + ":hamburger:": "🍔", + ":pizza:": "🍕", + ":meat_on_bone:": "🍖", + ":lizard:": "🦎", + ":poultry_leg:": "🍗", + ":rice_cracker:": "🍘", + ":rice_ball:": "🍙", + ":gorilla:": "🦍", + ":rice:": "🍚", + ":curry:": "🍛", + ":deer:": "🦌", + ":ramen:": "🍜", + ":spaghetti:": "🍝", + ":bread:": "🍞", + ":fries:": "🍟", + ":butterfly:": "🦋", + ":sweet_potato:": "🍠", + ":dango:": "🍡", + ":fox:": "🦊", + ":fox_face:": "🦊", + ":oden:": "🍢", + ":sushi:": "🍣", + ":owl:": "🦉", + ":fried_shrimp:": "🍤", + ":fish_cake:": "🍥", + ":shark:": "🦈", + ":icecream:": "🍦", + ":bat:": "🦇", + ":shaved_ice:": "🍧", + ":regional_indicator_x:": "🇽", + ":ice_cream:": "🍨", + ":duck:": "🦆", + ":doughnut:": "🍩", + ":eagle:": "🦅", + ":cookie:": "🍪", + ":black_heart:": "🖤", + ":chocolate_bar:": "🍫", + ":candy:": "🍬", + ":lollipop:": "🍭", + ":custard:": "🍮", + ":pudding:": "🍮", + ":flan:": "🍮", + ":honey_pot:": "🍯", + ":fingers_crossed:": "🤞", + ":hand_with_index_and_middle_finger_crossed:": "🤞", + ":cake:": "🍰", + ":bento:": "🍱", + ":stew:": "🍲", + ":handshake:": "🤝", + ":shaking_hands:": "🤝", + ":cooking:": "🍳", + ":fork_and_knife:": "🍴", + ":tea:": "🍵", + ":sake:": "🍶", + ":wine_glass:": "🍷", + ":cocktail:": "🍸", + ":tropical_drink:": "🍹", + ":beer:": "🍺", + ":beers:": "🍻", + ":ribbon:": "🎀", + ":gift:": "🎁", + ":birthday:": "🎂", + ":jack_o_lantern:": "🎃", + ":left_facing_fist:": "🤛", + ":left_fist:": "🤛", + ":right_facing_fist:": "🤜", + ":right_fist:": "🤜", + ":christmas_tree:": "🎄", + ":santa:": "🎅", + ":fireworks:": "🎆", + ":raised_back_of_hand:": "🤚", + ":back_of_hand:": "🤚", + ":sparkler:": "🎇", + ":balloon:": "🎈", + ":tada:": "🎉", + ":confetti_ball:": "🎊", + ":tanabata_tree:": "🎋", + ":crossed_flags:": "🎌", + ":call_me:": "🤙", + ":call_me_hand:": "🤙", + ":bamboo:": "🎍", + ":man_dancing:": "🕺", + ":male_dancer:": "🕺", + ":dolls:": "🎎", + ":selfie:": "🤳", + ":flags:": "🎏", + ":pregnant_woman:": "🤰", + ":expecting_woman:": "🤰", + ":wind_chime:": "🎐", + ":face_palm:": "🤦", + ":facepalm:": "🤦", + ":shrug:": "🤷", + ":rice_scene:": "🎑", + ":school_satchel:": "🎒", + ":mortar_board:": "🎓", + ":carousel_horse:": "🎠", + ":ferris_wheel:": "🎡", + ":roller_coaster:": "🎢", + ":fishing_pole_and_fish:": "🎣", + ":microphone:": "🎤", + ":pound_symbol:": "#", + ":movie_camera:": "🎥", + ":cinema:": "🎦", + ":headphones:": "🎧", + ":mrs_claus:": "🤶", + ":mother_christmas:": "🤶", + ":art:": "🎨", + ":man_in_tuxedo:": "🤵", + ":tophat:": "🎩", + ":circus_tent:": "🎪", + ":prince:": "🤴", + ":ticket:": "🎫", + ":clapper:": "🎬", + ":performing_arts:": "🎭", + ":sneezing_face:": "🤧", + ":sneeze:": "🤧", + ":video_game:": "🎮", + ":dart:": "🎯", + ":slot_machine:": "🎰", + ":8ball:": "🎱", + ":game_die:": "🎲", + ":bowling:": "🎳", + ":flower_playing_cards:": "🎴", + ":lying_face:": "🤥", + ":liar:": "🤥", + ":musical_note:": "🎵", + ":notes:": "🎶", + ":saxophone:": "🎷", + ":drooling_face:": "🤤", + ":drool:": "🤤", + ":guitar:": "🎸", + ":musical_keyboard:": "🎹", + ":trumpet:": "🎺", + ":rofl:": "🤣", + ":rolling_on_the_floor_laughing:": "🤣", + ":violin:": "🎻", + ":musical_score:": "🎼", + ":running_shirt_with_sash:": "🎽", + ":nauseated_face:": "🤢", + ":sick:": "🤢", + ":tennis:": "🎾", + ":ski:": "🎿", + ":basketball:": "🏀", + ":checkered_flag:": "🏁", + ":clown:": "🤡", + ":clown_face:": "🤡", + ":snowboarder:": "🏂", + ":runner:": "🏃", + ":surfer:": "🏄", + ":trophy:": "🏆", + ":football:": "🏈", + ":swimmer:": "🏊", + ":house:": "🏠", + ":house_with_garden:": "🏡", + ":office:": "🏢", + ":post_office:": "🏣", + ":hospital:": "🏥", + ":bank:": "🏦", + ":atm:": "🏧", + ":hotel:": "🏨", + ":love_hotel:": "🏩", + ":convenience_store:": "🏪", + ":school:": "🏫", + ":department_store:": "🏬", + ":cowboy:": "🤠", + ":face_with_cowboy_hat:": "🤠", + ":factory:": "🏭", + ":izakaya_lantern:": "🏮", + ":japanese_castle:": "🏯", + ":european_castle:": "🏰", + ":snail:": "🐌", + ":snake:": "🐍", + ":racehorse:": "🐎", + ":sheep:": "🐑", + ":monkey:": "🐒", + ":chicken:": "🐔", + ":boar:": "🐗", + ":elephant:": "🐘", + ":octopus:": "🐙", + ":shell:": "🐚", + ":prince_tone1:": "🤴🏻", + ":bug:": "🐛", + ":ant:": "🐜", + ":bee:": "🐝", + ":beetle:": "🐞", + ":fish:": "🐟", + ":tropical_fish:": "🐠", + ":blowfish:": "🐡", + ":turtle:": "🐢", + ":hatching_chick:": "🐣", + ":baby_chick:": "🐤", + ":hatched_chick:": "🐥", + ":bird:": "🐦", + ":penguin:": "🐧", + ":koala:": "🐨", + ":poodle:": "🐩", + ":camel:": "🐫", + ":dolphin:": "🐬", + ":mouse:": "🐭", + ":cow:": "🐮", + ":tiger:": "🐯", + ":rabbit:": "🐰", + ":cat:": "🐱", + ":dragon_face:": "🐲", + ":whale:": "🐳", + ":horse:": "🐴", + ":monkey_face:": "🐵", + ":dog:": "🐶", + ":pig:": "🐷", + ":frog:": "🐸", + ":hamster:": "🐹", + ":wolf:": "🐺", + ":bear:": "🐻", + ":panda_face:": "🐼", + ":pig_nose:": "🐽", + ":feet:": "🐾", + ":paw_prints:": "🐾", + ":prince_tone2:": "🤴🏼", + ":eyes:": "👀", + ":ear:": "👂", + ":nose:": "👃", + ":lips:": "👄", + ":tongue:": "👅", + ":prince_tone3:": "🤴🏽", + ":point_up_2:": "👆", + ":point_down:": "👇", + ":point_left:": "👈", + ":point_right:": "👉", + ":punch:": "👊", + ":wave:": "👋", + ":ok_hand:": "👌", + ":thumbsup:": "👍", + ":+1:": "👍", + ":thumbup:": "👍", + ":thumbsdown:": "👎", + ":1:": "👎", + ":thumbdown:": "👎", + ":clap:": "👏", + ":open_hands:": "👐", + ":crown:": "👑", + ":womans_hat:": "👒", + ":eyeglasses:": "👓", + ":necktie:": "👔", + ":shirt:": "👕", + ":prince_tone4:": "🤴🏾", + ":jeans:": "👖", + ":dress:": "👗", + ":kimono:": "👘", + ":prince_tone5:": "🤴🏿", + ":bikini:": "👙", + ":womans_clothes:": "👚", + ":purse:": "👛", + ":handbag:": "👜", + ":pouch:": "👝", + ":mans_shoe:": "👞", + ":athletic_shoe:": "👟", + ":high_heel:": "👠", + ":sandal:": "👡", + ":boot:": "👢", + ":footprints:": "👣", + ":bust_in_silhouette:": "👤", + ":mrs_claus_tone1:": "🤶🏻", + ":mother_christmas_tone1:": "🤶🏻", + ":boy:": "👦", + ":girl:": "👧", + ":man:": "👨", + ":woman:": "👩", + ":family:": "👪", + ":couple:": "👫", + ":cop:": "👮", + ":dancers:": "👯", + ":bride_with_veil:": "👰", + ":person_with_blond_hair:": "👱", + ":man_with_gua_pi_mao:": "👲", + ":man_with_turban:": "👳", + ":older_man:": "👴", + ":older_woman:": "👵", + ":grandma:": "👵", + ":baby:": "👶", + ":construction_worker:": "👷", + ":princess:": "👸", + ":japanese_ogre:": "👹", + ":mrs_claus_tone2:": "🤶🏼", + ":mother_christmas_tone2:": "🤶🏼", + ":japanese_goblin:": "👺", + ":ghost:": "👻", + ":angel:": "👼", + ":alien:": "👽", + ":space_invader:": "👾", + ":mrs_claus_tone3:": "🤶🏽", + ":mother_christmas_tone3:": "🤶🏽", + ":imp:": "👿", + ":skull:": "💀", + ":skeleton:": "💀", + ":card_index:": "📇", + ":information_desk_person:": "💁", + ":guardsman:": "💂", + ":dancer:": "💃", + ":lipstick:": "💄", + ":nail_care:": "💅", + ":ledger:": "📒", + ":massage:": "💆", + ":notebook:": "📓", + ":haircut:": "💇", + ":notebook_with_decorative_cover:": "📔", + ":barber:": "💈", + ":closed_book:": "📕", + ":syringe:": "💉", + ":book:": "📖", + ":pill:": "💊", + ":green_book:": "📗", + ":kiss:": "💋", + ":blue_book:": "📘", + ":love_letter:": "💌", + ":orange_book:": "📙", + ":ring:": "💍", + ":books:": "📚", + ":gem:": "💎", + ":mrs_claus_tone4:": "🤶🏾", + ":mother_christmas_tone4:": "🤶🏾", + ":name_badge:": "📛", + ":couplekiss:": "💏", + ":scroll:": "📜", + ":bouquet:": "💐", + ":pencil:": "📝", + ":mrs_claus_tone5:": "🤶🏿", + ":mother_christmas_tone5:": "🤶🏿", + ":couple_with_heart:": "💑", + ":telephone_receiver:": "📞", + ":wedding:": "💒", + ":pager:": "📟", + ":fax:": "📠", + ":heartbeat:": "💓", + ":satellite:": "📡", + ":loudspeaker:": "📢", + ":man_in_tuxedo_tone1:": "🤵🏻", + ":tuxedo_tone1:": "🤵🏻", + ":broken_heart:": "💔", + ":mega:": "📣", + ":outbox_tray:": "📤", + ":two_hearts:": "💕", + ":inbox_tray:": "📥", + ":package:": "📦", + ":man_in_tuxedo_tone2:": "🤵🏼", + ":tuxedo_tone2:": "🤵🏼", + ":sparkling_heart:": "💖", + ":email:": "📧", + ":incoming_envelope:": "📨", + ":heartpulse:": "💗", + ":man_in_tuxedo_tone3:": "🤵🏽", + ":tuxedo_tone3:": "🤵🏽", + ":envelope_with_arrow:": "📩", + ":mailbox_closed:": "📪", + ":cupid:": "💘", + ":mailbox:": "📫", + ":man_in_tuxedo_tone4:": "🤵🏾", + ":tuxedo_tone4:": "🤵🏾", + ":postbox:": "📮", + ":blue_heart:": "💙", + ":newspaper:": "📰", + ":man_in_tuxedo_tone5:": "🤵🏿", + ":tuxedo_tone5:": "🤵🏿", + ":iphone:": "📱", + ":green_heart:": "💚", + ":shrug_tone1:": "🤷🏻", + ":calling:": "📲", + ":vibration_mode:": "📳", + ":yellow_heart:": "💛", + ":shrug_tone2:": "🤷🏼", + ":mobile_phone_off:": "📴", + ":signal_strength:": "📶", + ":shrug_tone3:": "🤷🏽", + ":purple_heart:": "💜", + ":shrug_tone4:": "🤷🏾", + ":camera:": "📷", + ":video_camera:": "📹", + ":gift_heart:": "💝", + ":tv:": "📺", + ":shrug_tone5:": "🤷🏿", + ":radio:": "📻", + ":revolving_hearts:": "💞", + ":vhs:": "📼", + ":face_palm_tone1:": "🤦🏻", + ":facepalm_tone1:": "🤦🏻", + ":arrows_clockwise:": "🔃", + ":heart_decoration:": "💟", + ":loud_sound:": "🔊", + ":battery:": "🔋", + ":diamond_shape_with_a_dot_inside:": "💠", + ":electric_plug:": "🔌", + ":mag:": "🔍", + ":face_palm_tone2:": "🤦🏼", + ":facepalm_tone2:": "🤦🏼", + ":bulb:": "💡", + ":mag_right:": "🔎", + ":lock_with_ink_pen:": "🔏", + ":anger:": "💢", + ":closed_lock_with_key:": "🔐", + ":key:": "🔑", + ":bomb:": "💣", + ":lock:": "🔒", + ":unlock:": "🔓", + ":zzz:": "💤", + ":bell:": "🔔", + ":bookmark:": "🔖", + ":boom:": "💥", + ":face_palm_tone3:": "🤦🏽", + ":facepalm_tone3:": "🤦🏽", + ":link:": "🔗", + ":radio_button:": "🔘", + ":sweat_drops:": "💦", + ":back:": "🔙", + ":end:": "🔚", + ":droplet:": "💧", + ":face_palm_tone4:": "🤦🏾", + ":facepalm_tone4:": "🤦🏾", + ":on:": "🔛", + ":soon:": "🔜", + ":dash:": "💨", + ":top:": "🔝", + ":underage:": "🔞", + ":poop:": "💩", + ":shit:": "💩", + ":hankey:": "💩", + ":poo:": "💩", + ":keycap_ten:": "🔟", + ":muscle:": "💪", + ":capital_abcd:": "🔠", + ":abcd:": "🔡", + ":dizzy:": "💫", + ":face_palm_tone5:": "🤦🏿", + ":facepalm_tone5:": "🤦🏿", + ":1234:": "🔢", + ":symbols:": "🔣", + ":speech_balloon:": "💬", + ":abc:": "🔤", + ":fire:": "🔥", + ":flame:": "🔥", + ":white_flower:": "💮", + ":flashlight:": "🔦", + ":wrench:": "🔧", + ":100:": "💯", + ":hammer:": "🔨", + ":nut_and_bolt:": "🔩", + ":moneybag:": "💰", + ":knife:": "🔪", + ":gun:": "🔫", + ":currency_exchange:": "💱", + ":pregnant_woman_tone1:": "🤰🏻", + ":expecting_woman_tone1:": "🤰🏻", + ":crystal_ball:": "🔮", + ":heavy_dollar_sign:": "💲", + ":six_pointed_star:": "🔯", + ":credit_card:": "💳", + ":beginner:": "🔰", + ":trident:": "🔱", + ":yen:": "💴", + ":pregnant_woman_tone2:": "🤰🏼", + ":expecting_woman_tone2:": "🤰🏼", + ":black_square_button:": "🔲", + ":white_square_button:": "🔳", + ":dollar:": "💵", + ":red_circle:": "🔴", + ":blue_circle:": "🔵", + ":money_with_wings:": "💸", + ":large_orange_diamond:": "🔶", + ":large_blue_diamond:": "🔷", + ":chart:": "💹", + ":pregnant_woman_tone3:": "🤰🏽", + ":expecting_woman_tone3:": "🤰🏽", + ":small_orange_diamond:": "🔸", + ":small_blue_diamond:": "🔹", + ":seat:": "💺", + ":small_red_triangle:": "🔺", + ":small_red_triangle_down:": "🔻", + ":computer:": "💻", + ":arrow_up_small:": "🔼", + ":briefcase:": "💼", + ":arrow_down_small:": "🔽", + ":clock1:": "🕐", + ":minidisc:": "💽", + ":clock2:": "🕑", + ":floppy_disk:": "💾", + ":pregnant_woman_tone4:": "🤰🏾", + ":expecting_woman_tone4:": "🤰🏾", + ":clock3:": "🕒", + ":cd:": "💿", + ":clock4:": "🕓", + ":dvd:": "📀", + ":clock5:": "🕔", + ":clock6:": "🕕", + ":file_folder:": "📁", + ":clock7:": "🕖", + ":clock8:": "🕗", + ":open_file_folder:": "📂", + ":clock9:": "🕘", + ":clock10:": "🕙", + ":page_with_curl:": "📃", + ":clock11:": "🕚", + ":clock12:": "🕛", + ":page_facing_up:": "📄", + ":mount_fuji:": "🗻", + ":tokyo_tower:": "🗼", + ":date:": "📅", + ":statue_of_liberty:": "🗽", + ":japan:": "🗾", + ":calendar:": "📆", + ":moyai:": "🗿", + ":grin:": "😁", + ":joy:": "😂", + ":smiley:": "😃", + ":chart_with_upwards_trend:": "📈", + ":smile:": "😄", + ":sweat_smile:": "😅", + ":chart_with_downwards_trend:": "📉", + ":laughing:": "😆", + ":satisfied:": "😆", + ":wink:": "😉", + ":bar_chart:": "📊", + ":blush:": "😊", + ":yum:": "😋", + ":clipboard:": "📋", + ":relieved:": "😌", + ":heart_eyes:": "😍", + ":pushpin:": "📌", + ":smirk:": "😏", + ":unamused:": "😒", + ":round_pushpin:": "📍", + ":sweat:": "😓", + ":pensive:": "😔", + ":paperclip:": "📎", + ":confounded:": "😖", + ":kissing_heart:": "😘", + ":pregnant_woman_tone5:": "🤰🏿", + ":expecting_woman_tone5:": "🤰🏿", + ":straight_ruler:": "📏", + ":kissing_closed_eyes:": "😚", + ":stuck_out_tongue_winking_eye:": "😜", + ":triangular_ruler:": "📐", + ":stuck_out_tongue_closed_eyes:": "😝", + ":disappointed:": "😞", + ":bookmark_tabs:": "📑", + ":angry:": "😠", + ":rage:": "😡", + ":cry:": "😢", + ":persevere:": "😣", + ":triumph:": "😤", + ":disappointed_relieved:": "😥", + ":fearful:": "😨", + ":weary:": "😩", + ":sleepy:": "😪", + ":tired_face:": "😫", + ":sob:": "😭", + ":cold_sweat:": "😰", + ":scream:": "😱", + ":astonished:": "😲", + ":flushed:": "😳", + ":dizzy_face:": "😵", + ":mask:": "😷", + ":smile_cat:": "😸", + ":joy_cat:": "😹", + ":smiley_cat:": "😺", + ":heart_eyes_cat:": "😻", + ":smirk_cat:": "😼", + ":kissing_cat:": "😽", + ":pouting_cat:": "😾", + ":crying_cat_face:": "😿", + ":scream_cat:": "🙀", + ":no_good:": "🙅", + ":ok_woman:": "🙆", + ":bow:": "🙇", + ":see_no_evil:": "🙈", + ":man_dancing_tone1:": "🕺🏻", + ":male_dancer_tone1:": "🕺🏻", + ":hear_no_evil:": "🙉", + ":speak_no_evil:": "🙊", + ":man_dancing_tone2:": "🕺🏼", + ":male_dancer_tone2:": "🕺🏼", + ":raising_hand:": "🙋", + ":raised_hands:": "🙌", + ":person_frowning:": "🙍", + ":person_with_pouting_face:": "🙎", + ":pray:": "🙏", + ":rocket:": "🚀", + ":railway_car:": "🚃", + ":bullettrain_side:": "🚄", + ":bullettrain_front:": "🚅", + ":metro:": "🚇", + ":station:": "🚉", + ":bus:": "🚌", + ":busstop:": "🚏", + ":ambulance:": "🚑", + ":fire_engine:": "🚒", + ":police_car:": "🚓", + ":taxi:": "🚕", + ":red_car:": "🚗", + ":blue_car:": "🚙", + ":truck:": "🚚", + ":ship:": "🚢", + ":speedboat:": "🚤", + ":traffic_light:": "🚥", + ":construction:": "🚧", + ":rotating_light:": "🚨", + ":triangular_flag_on_post:": "🚩", + ":door:": "🚪", + ":man_dancing_tone3:": "🕺🏽", + ":male_dancer_tone3:": "🕺🏽", + ":no_entry_sign:": "🚫", + ":smoking:": "🚬", + ":no_smoking:": "🚭", + ":bike:": "🚲", + ":walking:": "🚶", + ":mens:": "🚹", + ":womens:": "🚺", + ":man_dancing_tone4:": "🕺🏾", + ":male_dancer_tone4:": "🕺🏾", + ":restroom:": "🚻", + ":baby_symbol:": "🚼", + ":man_dancing_tone5:": "🕺🏿", + ":male_dancer_tone5:": "🕺🏿", + ":toilet:": "🚽", + ":wc:": "🚾", + ":selfie_tone1:": "🤳🏻", + ":bath:": "🛀", + ":metal:": "🤘", + ":sign_of_the_horns:": "🤘", + ":grinning:": "😀", + ":innocent:": "😇", + ":smiling_imp:": "😈", + ":sunglasses:": "😎", + ":neutral_face:": "😐", + ":expressionless:": "😑", + ":confused:": "😕", + ":kissing:": "😗", + ":selfie_tone2:": "🤳🏼", + ":kissing_smiling_eyes:": "😙", + ":stuck_out_tongue:": "😛", + ":worried:": "😟", + ":frowning:": "😦", + ":anguished:": "😧", + ":grimacing:": "😬", + ":open_mouth:": "😮", + ":hushed:": "😯", + ":sleeping:": "😴", + ":no_mouth:": "😶", + ":helicopter:": "🚁", + ":steam_locomotive:": "🚂", + ":train2:": "🚆", + ":light_rail:": "🚈", + ":tram:": "🚊", + ":oncoming_bus:": "🚍", + ":trolleybus:": "🚎", + ":minibus:": "🚐", + ":oncoming_police_car:": "🚔", + ":oncoming_taxi:": "🚖", + ":oncoming_automobile:": "🚘", + ":articulated_lorry:": "🚛", + ":selfie_tone3:": "🤳🏽", + ":tractor:": "🚜", + ":monorail:": "🚝", + ":mountain_railway:": "🚞", + ":suspension_railway:": "🚟", + ":mountain_cableway:": "🚠", + ":aerial_tramway:": "🚡", + ":rowboat:": "🚣", + ":vertical_traffic_light:": "🚦", + ":selfie_tone4:": "🤳🏾", + ":put_litter_in_its_place:": "🚮", + ":do_not_litter:": "🚯", + ":selfie_tone5:": "🤳🏿", + ":potable_water:": "🚰", + ":nonpotable_water:": "🚱", + ":no_bicycles:": "🚳", + ":fingers_crossed_tone1:": "🤞🏻", + ":hand_with_index_and_middle_fingers_crossed_tone1:": "🤞🏻", + ":bicyclist:": "🚴", + ":mountain_bicyclist:": "🚵", + ":no_pedestrians:": "🚷", + ":children_crossing:": "🚸", + ":shower:": "🚿", + ":bathtub:": "🛁", + ":passport_control:": "🛂", + ":fingers_crossed_tone2:": "🤞🏼", + ":hand_with_index_and_middle_fingers_crossed_tone2:": "🤞🏼", + ":customs:": "🛃", + ":baggage_claim:": "🛄", + ":fingers_crossed_tone3:": "🤞🏽", + ":hand_with_index_and_middle_fingers_crossed_tone3:": "🤞🏽", + ":left_luggage:": "🛅", + ":earth_africa:": "🌍", + ":earth_americas:": "🌎", + ":globe_with_meridians:": "🌐", + ":waxing_crescent_moon:": "🌒", + ":waning_gibbous_moon:": "🌖", + ":last_quarter_moon:": "🌗", + ":waning_crescent_moon:": "🌘", + ":new_moon_with_face:": "🌚", + ":last_quarter_moon_with_face:": "🌜", + ":full_moon_with_face:": "🌝", + ":sun_with_face:": "🌞", + ":evergreen_tree:": "🌲", + ":deciduous_tree:": "🌳", + ":lemon:": "🍋", + ":fingers_crossed_tone4:": "🤞🏾", + ":hand_with_index_and_middle_fingers_crossed_tone4:": "🤞🏾", + ":pear:": "🍐", + ":baby_bottle:": "🍼", + ":horse_racing:": "🏇", + ":rugby_football:": "🏉", + ":european_post_office:": "🏤", + ":rat:": "🐀", + ":mouse2:": "🐁", + ":ox:": "🐂", + ":water_buffalo:": "🐃", + ":cow2:": "🐄", + ":tiger2:": "🐅", + ":leopard:": "🐆", + ":rabbit2:": "🐇", + ":cat2:": "🐈", + ":dragon:": "🐉", + ":crocodile:": "🐊", + ":whale2:": "🐋", + ":ram:": "🐏", + ":goat:": "🐐", + ":rooster:": "🐓", + ":dog2:": "🐕", + ":pig2:": "🐖", + ":fingers_crossed_tone5:": "🤞🏿", + ":hand_with_index_and_middle_fingers_crossed_tone5:": "🤞🏿", + ":dromedary_camel:": "🐪", + ":busts_in_silhouette:": "👥", + ":two_men_holding_hands:": "👬", + ":two_women_holding_hands:": "👭", + ":thought_balloon:": "💭", + ":euro:": "💶", + ":call_me_tone1:": "🤙🏻", + ":call_me_hand_tone1:": "🤙🏻", + ":pound:": "💷", + ":mailbox_with_mail:": "📬", + ":mailbox_with_no_mail:": "📭", + ":call_me_tone2:": "🤙🏼", + ":call_me_hand_tone2:": "🤙🏼", + ":postal_horn:": "📯", + ":no_mobile_phones:": "📵", + ":twisted_rightwards_arrows:": "🔀", + ":repeat:": "🔁", + ":repeat_one:": "🔂", + ":arrows_counterclockwise:": "🔄", + ":call_me_tone3:": "🤙🏽", + ":call_me_hand_tone3:": "🤙🏽", + ":low_brightness:": "🔅", + ":high_brightness:": "🔆", + ":mute:": "🔇", + ":sound:": "🔉", + ":no_bell:": "🔕", + ":microscope:": "🔬", + ":telescope:": "🔭", + ":clock130:": "🕜", + ":clock230:": "🕝", + ":clock330:": "🕞", + ":clock430:": "🕟", + ":clock530:": "🕠", + ":clock630:": "🕡", + ":clock730:": "🕢", + ":clock830:": "🕣", + ":clock930:": "🕤", + ":clock1030:": "🕥", + ":clock1130:": "🕦", + ":clock1230:": "🕧", + ":speaker:": "🔈", + ":train:": "🚋", + ":loop:": "➿", + ":flag_af:": "🇦🇫", + ":af:": "🇦🇫", + ":flag_al:": "🇦🇱", + ":al:": "🇦🇱", + ":flag_dz:": "🇩🇿", + ":dz:": "🇩🇿", + ":flag_ad:": "🇦🇩", + ":ad:": "🇦🇩", + ":flag_ao:": "🇦🇴", + ":ao:": "🇦🇴", + ":flag_ag:": "🇦🇬", + ":ag:": "🇦🇬", + ":flag_ar:": "🇦🇷", + ":ar:": "🇦🇷", + ":flag_am:": "🇦🇲", + ":am:": "🇦🇲", + ":flag_au:": "🇦🇺", + ":au:": "🇦🇺", + ":flag_at:": "🇦🇹", + ":at:": "🇦🇹", + ":flag_az:": "🇦🇿", + ":az:": "🇦🇿", + ":flag_bs:": "🇧🇸", + ":bs:": "🇧🇸", + ":flag_bh:": "🇧🇭", + ":bh:": "🇧🇭", + ":flag_bd:": "🇧🇩", + ":bd:": "🇧🇩", + ":flag_bb:": "🇧🇧", + ":bb:": "🇧🇧", + ":flag_by:": "🇧🇾", + ":by:": "🇧🇾", + ":flag_be:": "🇧🇪", + ":be:": "🇧🇪", + ":flag_bz:": "🇧🇿", + ":bz:": "🇧🇿", + ":flag_bj:": "🇧🇯", + ":bj:": "🇧🇯", + ":flag_bt:": "🇧🇹", + ":bt:": "🇧🇹", + ":flag_bo:": "🇧🇴", + ":bo:": "🇧🇴", + ":flag_ba:": "🇧🇦", + ":ba:": "🇧🇦", + ":flag_bw:": "🇧🇼", + ":bw:": "🇧🇼", + ":flag_br:": "🇧🇷", + ":br:": "🇧🇷", + ":flag_bn:": "🇧🇳", + ":bn:": "🇧🇳", + ":flag_bg:": "🇧🇬", + ":bg:": "🇧🇬", + ":flag_bf:": "🇧🇫", + ":bf:": "🇧🇫", + ":flag_bi:": "🇧🇮", + ":bi:": "🇧🇮", + ":flag_kh:": "🇰🇭", + ":kh:": "🇰🇭", + ":flag_cm:": "🇨🇲", + ":cm:": "🇨🇲", + ":flag_ca:": "🇨🇦", + ":ca:": "🇨🇦", + ":flag_cv:": "🇨🇻", + ":cv:": "🇨🇻", + ":call_me_tone4:": "🤙🏾", + ":call_me_hand_tone4:": "🤙🏾", + ":flag_cf:": "🇨🇫", + ":cf:": "🇨🇫", + ":flag_td:": "🇹🇩", + ":td:": "🇹🇩", + ":flag_cl:": "🇨🇱", + ":chile:": "🇨🇱", + ":flag_co:": "🇨🇴", + ":co:": "🇨🇴", + ":flag_km:": "🇰🇲", + ":km:": "🇰🇲", + ":flag_cr:": "🇨🇷", + ":cr:": "🇨🇷", + ":flag_ci:": "🇨🇮", + ":ci:": "🇨🇮", + ":flag_hr:": "🇭🇷", + ":hr:": "🇭🇷", + ":flag_cu:": "🇨🇺", + ":cu:": "🇨🇺", + ":flag_cy:": "🇨🇾", + ":cy:": "🇨🇾", + ":flag_cz:": "🇨🇿", + ":cz:": "🇨🇿", + ":call_me_tone5:": "🤙🏿", + ":call_me_hand_tone5:": "🤙🏿", + ":flag_cd:": "🇨🇩", + ":congo:": "🇨🇩", + ":left_facing_fist_tone1:": "🤛🏻", + ":left_fist_tone1:": "🤛🏻", + ":flag_dk:": "🇩🇰", + ":dk:": "🇩🇰", + ":flag_dj:": "🇩🇯", + ":dj:": "🇩🇯", + ":flag_dm:": "🇩🇲", + ":dm:": "🇩🇲", + ":flag_do:": "🇩🇴", + ":do:": "🇩🇴", + ":flag_tl:": "🇹🇱", + ":tl:": "🇹🇱", + ":flag_ec:": "🇪🇨", + ":ec:": "🇪🇨", + ":flag_eg:": "🇪🇬", + ":eg:": "🇪🇬", + ":flag_sv:": "🇸🇻", + ":sv:": "🇸🇻", + ":flag_gq:": "🇬🇶", + ":gq:": "🇬🇶", + ":flag_er:": "🇪🇷", + ":er:": "🇪🇷", + ":flag_ee:": "🇪🇪", + ":ee:": "🇪🇪", + ":flag_et:": "🇪🇹", + ":et:": "🇪🇹", + ":left_facing_fist_tone2:": "🤛🏼", + ":left_fist_tone2:": "🤛🏼", + ":flag_fj:": "🇫🇯", + ":fj:": "🇫🇯", + ":flag_fi:": "🇫🇮", + ":fi:": "🇫🇮", + ":flag_ga:": "🇬🇦", + ":ga:": "🇬🇦", + ":flag_gm:": "🇬🇲", + ":gm:": "🇬🇲", + ":flag_ge:": "🇬🇪", + ":ge:": "🇬🇪", + ":flag_gh:": "🇬🇭", + ":gh:": "🇬🇭", + ":flag_gr:": "🇬🇷", + ":gr:": "🇬🇷", + ":flag_gd:": "🇬🇩", + ":gd:": "🇬🇩", + ":flag_gt:": "🇬🇹", + ":gt:": "🇬🇹", + ":flag_gn:": "🇬🇳", + ":gn:": "🇬🇳", + ":flag_gw:": "🇬🇼", + ":gw:": "🇬🇼", + ":flag_gy:": "🇬🇾", + ":gy:": "🇬🇾", + ":flag_ht:": "🇭🇹", + ":ht:": "🇭🇹", + ":flag_hn:": "🇭🇳", + ":hn:": "🇭🇳", + ":flag_hu:": "🇭🇺", + ":hu:": "🇭🇺", + ":flag_is:": "🇮🇸", + ":is:": "🇮🇸", + ":flag_in:": "🇮🇳", + ":in:": "🇮🇳", + ":flag_id:": "🇮🇩", + ":indonesia:": "🇮🇩", + ":flag_ir:": "🇮🇷", + ":ir:": "🇮🇷", + ":flag_iq:": "🇮🇶", + ":iq:": "🇮🇶", + ":flag_ie:": "🇮🇪", + ":ie:": "🇮🇪", + ":flag_il:": "🇮🇱", + ":il:": "🇮🇱", + ":flag_jm:": "🇯🇲", + ":jm:": "🇯🇲", + ":flag_jo:": "🇯🇴", + ":jo:": "🇯🇴", + ":flag_kz:": "🇰🇿", + ":kz:": "🇰🇿", + ":flag_ke:": "🇰🇪", + ":ke:": "🇰🇪", + ":flag_ki:": "🇰🇮", + ":ki:": "🇰🇮", + ":flag_xk:": "🇽🇰", + ":xk:": "🇽🇰", + ":flag_kw:": "🇰🇼", + ":kw:": "🇰🇼", + ":flag_kg:": "🇰🇬", + ":kg:": "🇰🇬", + ":left_facing_fist_tone3:": "🤛🏽", + ":left_fist_tone3:": "🤛🏽", + ":flag_la:": "🇱🇦", + ":la:": "🇱🇦", + ":flag_lv:": "🇱🇻", + ":lv:": "🇱🇻", + ":flag_lb:": "🇱🇧", + ":lb:": "🇱🇧", + ":flag_ls:": "🇱🇸", + ":ls:": "🇱🇸", + ":flag_lr:": "🇱🇷", + ":lr:": "🇱🇷", + ":flag_ly:": "🇱🇾", + ":ly:": "🇱🇾", + ":flag_li:": "🇱🇮", + ":li:": "🇱🇮", + ":flag_lt:": "🇱🇹", + ":lt:": "🇱🇹", + ":flag_lu:": "🇱🇺", + ":lu:": "🇱🇺", + ":flag_mk:": "🇲🇰", + ":mk:": "🇲🇰", + ":flag_mg:": "🇲🇬", + ":mg:": "🇲🇬", + ":flag_mw:": "🇲🇼", + ":mw:": "🇲🇼", + ":flag_my:": "🇲🇾", + ":my:": "🇲🇾", + ":flag_mv:": "🇲🇻", + ":mv:": "🇲🇻", + ":flag_ml:": "🇲🇱", + ":ml:": "🇲🇱", + ":flag_mt:": "🇲🇹", + ":mt:": "🇲🇹", + ":flag_mh:": "🇲🇭", + ":mh:": "🇲🇭", + ":flag_mr:": "🇲🇷", + ":mr:": "🇲🇷", + ":flag_mu:": "🇲🇺", + ":mu:": "🇲🇺", + ":flag_mx:": "🇲🇽", + ":mx:": "🇲🇽", + ":flag_fm:": "🇫🇲", + ":fm:": "🇫🇲", + ":flag_md:": "🇲🇩", + ":md:": "🇲🇩", + ":flag_mc:": "🇲🇨", + ":mc:": "🇲🇨", + ":flag_mn:": "🇲🇳", + ":mn:": "🇲🇳", + ":flag_me:": "🇲🇪", + ":me:": "🇲🇪", + ":flag_ma:": "🇲🇦", + ":ma:": "🇲🇦", + ":flag_mz:": "🇲🇿", + ":mz:": "🇲🇿", + ":flag_mm:": "🇲🇲", + ":mm:": "🇲🇲", + ":flag_na:": "🇳🇦", + ":na:": "🇳🇦", + ":flag_nr:": "🇳🇷", + ":nr:": "🇳🇷", + ":flag_np:": "🇳🇵", + ":np:": "🇳🇵", + ":flag_nl:": "🇳🇱", + ":nl:": "🇳🇱", + ":flag_nz:": "🇳🇿", + ":nz:": "🇳🇿", + ":flag_ni:": "🇳🇮", + ":ni:": "🇳🇮", + ":flag_ne:": "🇳🇪", + ":ne:": "🇳🇪", + ":flag_ng:": "🇳🇬", + ":nigeria:": "🇳🇬", + ":flag_kp:": "🇰🇵", + ":kp:": "🇰🇵", + ":flag_no:": "🇳🇴", + ":no:": "🇳🇴", + ":flag_om:": "🇴🇲", + ":om:": "🇴🇲", + ":flag_pk:": "🇵🇰", + ":pk:": "🇵🇰", + ":flag_pw:": "🇵🇼", + ":pw:": "🇵🇼", + ":flag_pa:": "🇵🇦", + ":pa:": "🇵🇦", + ":flag_pg:": "🇵🇬", + ":pg:": "🇵🇬", + ":left_facing_fist_tone4:": "🤛🏾", + ":left_fist_tone4:": "🤛🏾", + ":flag_py:": "🇵🇾", + ":py:": "🇵🇾", + ":flag_pe:": "🇵🇪", + ":pe:": "🇵🇪", + ":flag_ph:": "🇵🇭", + ":ph:": "🇵🇭", + ":flag_pl:": "🇵🇱", + ":pl:": "🇵🇱", + ":flag_pt:": "🇵🇹", + ":pt:": "🇵🇹", + ":flag_qa:": "🇶🇦", + ":qa:": "🇶🇦", + ":flag_tw:": "🇹🇼", + ":tw:": "🇹🇼", + ":flag_cg:": "🇨🇬", + ":cg:": "🇨🇬", + ":flag_ro:": "🇷🇴", + ":ro:": "🇷🇴", + ":flag_rw:": "🇷🇼", + ":rw:": "🇷🇼", + ":flag_kn:": "🇰🇳", + ":kn:": "🇰🇳", + ":flag_lc:": "🇱🇨", + ":lc:": "🇱🇨", + ":flag_vc:": "🇻🇨", + ":vc:": "🇻🇨", + ":flag_ws:": "🇼🇸", + ":ws:": "🇼🇸", + ":flag_sm:": "🇸🇲", + ":sm:": "🇸🇲", + ":flag_st:": "🇸🇹", + ":st:": "🇸🇹", + ":flag_sa:": "🇸🇦", + ":saudiarabia:": "🇸🇦", + ":saudi:": "🇸🇦", + ":left_facing_fist_tone5:": "🤛🏿", + ":left_fist_tone5:": "🤛🏿", + ":flag_sn:": "🇸🇳", + ":sn:": "🇸🇳", + ":flag_rs:": "🇷🇸", + ":rs:": "🇷🇸", + ":flag_sc:": "🇸🇨", + ":sc:": "🇸🇨", + ":flag_sl:": "🇸🇱", + ":sl:": "🇸🇱", + ":flag_sg:": "🇸🇬", + ":sg:": "🇸🇬", + ":flag_sk:": "🇸🇰", + ":sk:": "🇸🇰", + ":flag_si:": "🇸🇮", + ":si:": "🇸🇮", + ":flag_sb:": "🇸🇧", + ":sb:": "🇸🇧", + ":flag_so:": "🇸🇴", + ":so:": "🇸🇴", + ":flag_za:": "🇿🇦", + ":za:": "🇿🇦", + ":flag_lk:": "🇱🇰", + ":lk:": "🇱🇰", + ":flag_sd:": "🇸🇩", + ":sd:": "🇸🇩", + ":flag_sr:": "🇸🇷", + ":sr:": "🇸🇷", + ":flag_sz:": "🇸🇿", + ":sz:": "🇸🇿", + ":flag_se:": "🇸🇪", + ":se:": "🇸🇪", + ":flag_ch:": "🇨🇭", + ":ch:": "🇨🇭", + ":flag_sy:": "🇸🇾", + ":sy:": "🇸🇾", + ":flag_tj:": "🇹🇯", + ":tj:": "🇹🇯", + ":flag_tz:": "🇹🇿", + ":tz:": "🇹🇿", + ":flag_th:": "🇹🇭", + ":th:": "🇹🇭", + ":flag_tg:": "🇹🇬", + ":tg:": "🇹🇬", + ":flag_to:": "🇹🇴", + ":to:": "🇹🇴", + ":flag_tt:": "🇹🇹", + ":tt:": "🇹🇹", + ":flag_tn:": "🇹🇳", + ":tn:": "🇹🇳", + ":flag_tr:": "🇹🇷", + ":tr:": "🇹🇷", + ":flag_tm:": "🇹🇲", + ":turkmenistan:": "🇹🇲", + ":flag_tv:": "🇹🇻", + ":tuvalu:": "🇹🇻", + ":flag_ug:": "🇺🇬", + ":ug:": "🇺🇬", + ":flag_ua:": "🇺🇦", + ":ua:": "🇺🇦", + ":flag_ae:": "🇦🇪", + ":ae:": "🇦🇪", + ":flag_uy:": "🇺🇾", + ":uy:": "🇺🇾", + ":flag_uz:": "🇺🇿", + ":uz:": "🇺🇿", + ":flag_vu:": "🇻🇺", + ":vu:": "🇻🇺", + ":flag_va:": "🇻🇦", + ":va:": "🇻🇦", + ":flag_ve:": "🇻🇪", + ":ve:": "🇻🇪", + ":flag_vn:": "🇻🇳", + ":vn:": "🇻🇳", + ":flag_eh:": "🇪🇭", + ":eh:": "🇪🇭", + ":right_facing_fist_tone1:": "🤜🏻", + ":right_fist_tone1:": "🤜🏻", + ":flag_ye:": "🇾🇪", + ":ye:": "🇾🇪", + ":flag_zm:": "🇿🇲", + ":zm:": "🇿🇲", + ":flag_zw:": "🇿🇼", + ":zw:": "🇿🇼", + ":flag_pr:": "🇵🇷", + ":pr:": "🇵🇷", + ":flag_ky:": "🇰🇾", + ":ky:": "🇰🇾", + ":flag_bm:": "🇧🇲", + ":bm:": "🇧🇲", + ":flag_pf:": "🇵🇫", + ":pf:": "🇵🇫", + ":flag_ps:": "🇵🇸", + ":ps:": "🇵🇸", + ":flag_nc:": "🇳🇨", + ":nc:": "🇳🇨", + ":right_facing_fist_tone2:": "🤜🏼", + ":right_fist_tone2:": "🤜🏼", + ":flag_sh:": "🇸🇭", + ":sh:": "🇸🇭", + ":flag_aw:": "🇦🇼", + ":aw:": "🇦🇼", + ":flag_vi:": "🇻🇮", + ":vi:": "🇻🇮", + ":flag_hk:": "🇭🇰", + ":hk:": "🇭🇰", + ":flag_ac:": "🇦🇨", + ":ac:": "🇦🇨", + ":flag_ms:": "🇲🇸", + ":ms:": "🇲🇸", + ":flag_gu:": "🇬🇺", + ":gu:": "🇬🇺", + ":flag_gl:": "🇬🇱", + ":gl:": "🇬🇱", + ":flag_nu:": "🇳🇺", + ":nu:": "🇳🇺", + ":flag_wf:": "🇼🇫", + ":wf:": "🇼🇫", + ":flag_mo:": "🇲🇴", + ":mo:": "🇲🇴", + ":right_facing_fist_tone3:": "🤜🏽", + ":right_fist_tone3:": "🤜🏽", + ":flag_fo:": "🇫🇴", + ":fo:": "🇫🇴", + ":flag_fk:": "🇫🇰", + ":fk:": "🇫🇰", + ":flag_je:": "🇯🇪", + ":je:": "🇯🇪", + ":flag_ai:": "🇦🇮", + ":ai:": "🇦🇮", + ":flag_gi:": "🇬🇮", + ":gi:": "🇬🇮", + ":film_frames:": "🎞", + ":tickets:": "🎟", + ":admission_tickets:": "🎟", + ":medal:": "🏅", + ":sports_medal:": "🏅", + ":lifter:": "🏋", + ":weight_lifter:": "🏋", + ":golfer:": "🏌", + ":motorcycle:": "🏍", + ":racing_motorcycle:": "🏍", + ":race_car:": "🏎", + ":racing_car:": "🏎", + ":military_medal:": "🎖", + ":reminder_ribbon:": "🎗", + ":hot_pepper:": "🌶", + ":right_facing_fist_tone4:": "🤜🏾", + ":right_fist_tone4:": "🤜🏾", + ":cloud_rain:": "🌧", + ":cloud_with_rain:": "🌧", + ":cloud_snow:": "🌨", + ":cloud_with_snow:": "🌨", + ":cloud_lightning:": "🌩", + ":cloud_with_lightning:": "🌩", + ":cloud_tornado:": "🌪", + ":cloud_with_tornado:": "🌪", + ":fog:": "🌫", + ":wind_blowing_face:": "🌬", + ":chipmunk:": "🐿", + ":spider:": "🕷", + ":spider_web:": "🕸", + ":thermometer:": "🌡", + ":microphone2:": "🎙", + ":studio_microphone:": "🎙", + ":level_slider:": "🎚", + ":control_knobs:": "🎛", + ":flag_white:": "🏳", + ":waving_white_flag:": "🏳", + ":flag_black:": "🏴", + ":waving_black_flag:": "🏴", + ":rosette:": "🏵", + ":label:": "🏷", + ":camera_with_flash:": "📸", + ":projector:": "📽", + ":film_projector:": "📽", + ":cross:": "✝", + ":latin_cross:": "✝", + ":om_symbol:": "🕉", + ":dove:": "🕊", + ":dove_of_peace:": "🕊", + ":candle:": "🕯", + ":clock:": "🕰", + ":mantlepiece_clock:": "🕰", + ":hole:": "🕳", + ":dark_sunglasses:": "🕶", + ":joystick:": "🕹", + ":paperclips:": "🖇", + ":linked_paperclips:": "🖇", + ":pen_ballpoint:": "🖊", + ":lower_left_ballpoint_pen:": "🖊", + ":pen_fountain:": "🖋", + ":lower_left_fountain_pen:": "🖋", + ":paintbrush:": "🖌", + ":lower_left_paintbrush:": "🖌", + ":crayon:": "🖍", + ":lower_left_crayon:": "🖍", + ":desktop:": "🖥", + ":desktop_computer:": "🖥", + ":printer:": "🖨", + ":right_facing_fist_tone5:": "🤜🏿", + ":right_fist_tone5:": "🤜🏿", + ":keyboard:": "⌨", + ":trackball:": "🖲", + ":raised_back_of_hand_tone1:": "🤚🏻", + ":back_of_hand_tone1:": "🤚🏻", + ":frame_photo:": "🖼", + ":frame_with_picture:": "🖼", + ":dividers:": "🗂", + ":card_index_dividers:": "🗂", + ":card_box:": "🗃", + ":card_file_box:": "🗃", + ":file_cabinet:": "🗄", + ":wastebasket:": "🗑", + ":notepad_spiral:": "🗒", + ":spiral_note_pad:": "🗒", + ":calendar_spiral:": "🗓", + ":spiral_calendar_pad:": "🗓", + ":compression:": "🗜", + ":key2:": "🗝", + ":old_key:": "🗝", + ":newspaper2:": "🗞", + ":rolled_up_newspaper:": "🗞", + ":dagger:": "🗡", + ":dagger_knife:": "🗡", + ":speaking_head:": "🗣", + ":speaking_head_in_silhouette:": "🗣", + ":speech_left:": "🗨", + ":left_speech_bubble:": "🗨", + ":raised_back_of_hand_tone2:": "🤚🏼", + ":back_of_hand_tone2:": "🤚🏼", + ":anger_right:": "🗯", + ":right_anger_bubble:": "🗯", + ":raised_back_of_hand_tone3:": "🤚🏽", + ":back_of_hand_tone3:": "🤚🏽", + ":ballot_box:": "🗳", + ":ballot_box_with_ballot:": "🗳", + ":map:": "🗺", + ":world_map:": "🗺", + ":sleeping_accommodation:": "🛌", + ":tools:": "🛠", + ":hammer_and_wrench:": "🛠", + ":shield:": "🛡", + ":oil:": "🛢", + ":oil_drum:": "🛢", + ":satellite_orbital:": "🛰", + ":fork_knife_plate:": "🍽", + ":fork_and_knife_with_plate:": "🍽", + ":eye:": "👁", + ":levitate:": "🕴", + ":man_in_business_suit_levitating:": "🕴", + ":spy:": "🕵", + ":sleuth_or_spy:": "🕵", + ":writing_hand:": "✍", + ":hand_splayed:": "🖐", + ":raised_hand_with_fingers_splayed:": "🖐", + ":middle_finger:": "🖕", + ":reversed_hand_with_middle_finger_extended:": "🖕", + ":vulcan:": "🖖", + ":raised_hand_with_part_between_middle_and_ring_fingers:": "🖖", + ":slight_frown:": "🙁", + ":slightly_frowning_face:": "🙁", + ":slight_smile:": "🙂", + ":slightly_smiling_face:": "🙂", + ":mountain_snow:": "🏔", + ":snow_capped_mountain:": "🏔", + ":camping:": "🏕", + ":beach:": "🏖", + ":beach_with_umbrella:": "🏖", + ":construction_site:": "🏗", + ":building_construction:": "🏗", + ":homes:": "🏘", + ":house_buildings:": "🏘", + ":cityscape:": "🏙", + ":house_abandoned:": "🏚", + ":derelict_house_building:": "🏚", + ":classical_building:": "🏛", + ":desert:": "🏜", + ":island:": "🏝", + ":desert_island:": "🏝", + ":park:": "🏞", + ":national_park:": "🏞", + ":stadium:": "🏟", + ":couch:": "🛋", + ":couch_and_lamp:": "🛋", + ":raised_back_of_hand_tone4:": "🤚🏾", + ":back_of_hand_tone4:": "🤚🏾", + ":shopping_bags:": "🛍", + ":bellhop:": "🛎", + ":bellhop_bell:": "🛎", + ":bed:": "🛏", + ":motorway:": "🛣", + ":railway_track:": "🛤", + ":railroad_track:": "🛤", + ":motorboat:": "🛥", + ":airplane_small:": "🛩", + ":small_airplane:": "🛩", + ":airplane_departure:": "🛫", + ":airplane_arriving:": "🛬", + ":cruise_ship:": "🛳", + ":passenger_ship:": "🛳", + ":baby_tone1:": "👶🏻", + ":baby_tone2:": "👶🏼", + ":baby_tone3:": "👶🏽", + ":baby_tone4:": "👶🏾", + ":baby_tone5:": "👶🏿", + ":boy_tone1:": "👦🏻", + ":boy_tone2:": "👦🏼", + ":boy_tone3:": "👦🏽", + ":boy_tone4:": "👦🏾", + ":boy_tone5:": "👦🏿", + ":girl_tone1:": "👧🏻", + ":girl_tone2:": "👧🏼", + ":girl_tone3:": "👧🏽", + ":girl_tone4:": "👧🏾", + ":girl_tone5:": "👧🏿", + ":man_tone1:": "👨🏻", + ":man_tone2:": "👨🏼", + ":man_tone3:": "👨🏽", + ":man_tone4:": "👨🏾", + ":man_tone5:": "👨🏿", + ":woman_tone1:": "👩🏻", + ":woman_tone2:": "👩🏼", + ":woman_tone3:": "👩🏽", + ":woman_tone4:": "👩🏾", + ":woman_tone5:": "👩🏿", + ":bride_with_veil_tone1:": "👰🏻", + ":bride_with_veil_tone2:": "👰🏼", + ":raised_back_of_hand_tone5:": "🤚🏿", + ":back_of_hand_tone5:": "🤚🏿", + ":bride_with_veil_tone3:": "👰🏽", + ":bride_with_veil_tone4:": "👰🏾", + ":bride_with_veil_tone5:": "👰🏿", + ":person_with_blond_hair_tone1:": "👱🏻", + ":person_with_blond_hair_tone2:": "👱🏼", + ":person_with_blond_hair_tone3:": "👱🏽", + ":person_with_blond_hair_tone4:": "👱🏾", + ":person_with_blond_hair_tone5:": "👱🏿", + ":man_with_gua_pi_mao_tone1:": "👲🏻", + ":man_with_gua_pi_mao_tone2:": "👲🏼", + ":man_with_gua_pi_mao_tone3:": "👲🏽", + ":man_with_gua_pi_mao_tone4:": "👲🏾", + ":man_with_gua_pi_mao_tone5:": "👲🏿", + ":man_with_turban_tone1:": "👳🏻", + ":man_with_turban_tone2:": "👳🏼", + ":man_with_turban_tone3:": "👳🏽", + ":man_with_turban_tone4:": "👳🏾", + ":man_with_turban_tone5:": "👳🏿", + ":older_man_tone1:": "👴🏻", + ":older_man_tone2:": "👴🏼", + ":older_man_tone3:": "👴🏽", + ":older_man_tone4:": "👴🏾", + ":older_man_tone5:": "👴🏿", + ":older_woman_tone1:": "👵🏻", + ":grandma_tone1:": "👵🏻", + ":older_woman_tone2:": "👵🏼", + ":grandma_tone2:": "👵🏼", + ":older_woman_tone3:": "👵🏽", + ":grandma_tone3:": "👵🏽", + ":older_woman_tone4:": "👵🏾", + ":grandma_tone4:": "👵🏾", + ":older_woman_tone5:": "👵🏿", + ":grandma_tone5:": "👵🏿", + ":cop_tone1:": "👮🏻", + ":cop_tone2:": "👮🏼", + ":cop_tone3:": "👮🏽", + ":cop_tone4:": "👮🏾", + ":cop_tone5:": "👮🏿", + ":construction_worker_tone1:": "👷🏻", + ":construction_worker_tone2:": "👷🏼", + ":construction_worker_tone3:": "👷🏽", + ":construction_worker_tone4:": "👷🏾", + ":construction_worker_tone5:": "👷🏿", + ":princess_tone1:": "👸🏻", + ":princess_tone2:": "👸🏼", + ":princess_tone3:": "👸🏽", + ":princess_tone4:": "👸🏾", + ":cartwheel_tone1:": "🤸🏻", + ":person_doing_cartwheel_tone1:": "🤸🏻", + ":princess_tone5:": "👸🏿", + ":guardsman_tone1:": "💂🏻", + ":guardsman_tone2:": "💂🏼", + ":cartwheel_tone2:": "🤸🏼", + ":person_doing_cartwheel_tone2:": "🤸🏼", + ":guardsman_tone3:": "💂🏽", + ":guardsman_tone4:": "💂🏾", + ":guardsman_tone5:": "💂🏿", + ":cartwheel_tone3:": "🤸🏽", + ":person_doing_cartwheel_tone3:": "🤸🏽", + ":angel_tone1:": "👼🏻", + ":angel_tone2:": "👼🏼", + ":angel_tone3:": "👼🏽", + ":angel_tone4:": "👼🏾", + ":angel_tone5:": "👼🏿", + ":bow_tone1:": "🙇🏻", + ":bow_tone2:": "🙇🏼", + ":bow_tone3:": "🙇🏽", + ":bow_tone4:": "🙇🏾", + ":bow_tone5:": "🙇🏿", + ":information_desk_person_tone1:": "💁🏻", + ":information_desk_person_tone2:": "💁🏼", + ":information_desk_person_tone3:": "💁🏽", + ":cartwheel_tone4:": "🤸🏾", + ":person_doing_cartwheel_tone4:": "🤸🏾", + ":information_desk_person_tone4:": "💁🏾", + ":information_desk_person_tone5:": "💁🏿", + ":no_good_tone1:": "🙅🏻", + ":cartwheel_tone5:": "🤸🏿", + ":person_doing_cartwheel_tone5:": "🤸🏿", + ":no_good_tone2:": "🙅🏼", + ":no_good_tone3:": "🙅🏽", + ":no_good_tone4:": "🙅🏾", + ":no_good_tone5:": "🙅🏿", + ":ok_woman_tone1:": "🙆🏻", + ":ok_woman_tone2:": "🙆🏼", + ":ok_woman_tone3:": "🙆🏽", + ":ok_woman_tone4:": "🙆🏾", + ":ok_woman_tone5:": "🙆🏿", + ":raising_hand_tone1:": "🙋🏻", + ":raising_hand_tone2:": "🙋🏼", + ":raising_hand_tone3:": "🙋🏽", + ":raising_hand_tone4:": "🙋🏾", + ":raising_hand_tone5:": "🙋🏿", + ":person_with_pouting_face_tone1:": "🙎🏻", + ":person_with_pouting_face_tone2:": "🙎🏼", + ":person_with_pouting_face_tone3:": "🙎🏽", + ":person_with_pouting_face_tone4:": "🙎🏾", + ":person_with_pouting_face_tone5:": "🙎🏿", + ":person_frowning_tone1:": "🙍🏻", + ":person_frowning_tone2:": "🙍🏼", + ":person_frowning_tone3:": "🙍🏽", + ":person_frowning_tone4:": "🙍🏾", + ":person_frowning_tone5:": "🙍🏿", + ":massage_tone1:": "💆🏻", + ":massage_tone2:": "💆🏼", + ":massage_tone3:": "💆🏽", + ":massage_tone4:": "💆🏾", + ":massage_tone5:": "💆🏿", + ":haircut_tone1:": "💇🏻", + ":haircut_tone2:": "💇🏼", + ":haircut_tone3:": "💇🏽", + ":haircut_tone4:": "💇🏾", + ":haircut_tone5:": "💇🏿", + ":raised_hands_tone1:": "🙌🏻", + ":raised_hands_tone2:": "🙌🏼", + ":raised_hands_tone3:": "🙌🏽", + ":raised_hands_tone4:": "🙌🏾", + ":raised_hands_tone5:": "🙌🏿", + ":clap_tone1:": "👏🏻", + ":clap_tone2:": "👏🏼", + ":clap_tone3:": "👏🏽", + ":water_polo_tone1:": "🤽🏻", + ":clap_tone4:": "👏🏾", + ":clap_tone5:": "👏🏿", + ":water_polo_tone2:": "🤽🏼", + ":ear_tone1:": "👂🏻", + ":ear_tone2:": "👂🏼", + ":ear_tone3:": "👂🏽", + ":ear_tone4:": "👂🏾", + ":ear_tone5:": "👂🏿", + ":nose_tone1:": "👃🏻", + ":nose_tone2:": "👃🏼", + ":nose_tone3:": "👃🏽", + ":nose_tone4:": "👃🏾", + ":nose_tone5:": "👃🏿", + ":nail_care_tone1:": "💅🏻", + ":nail_care_tone2:": "💅🏼", + ":nail_care_tone3:": "💅🏽", + ":nail_care_tone4:": "💅🏾", + ":nail_care_tone5:": "💅🏿", + ":wave_tone1:": "👋🏻", + ":wave_tone2:": "👋🏼", + ":wave_tone3:": "👋🏽", + ":wave_tone4:": "👋🏾", + ":wave_tone5:": "👋🏿", + ":thumbsup_tone1:": "👍🏻", + ":+1_tone1:": "👍🏻", + ":thumbup_tone1:": "👍🏻", + ":thumbsup_tone2:": "👍🏼", + ":+1_tone2:": "👍🏼", + ":thumbup_tone2:": "👍🏼", + ":thumbsup_tone3:": "👍🏽", + ":+1_tone3:": "👍🏽", + ":thumbup_tone3:": "👍🏽", + ":thumbsup_tone4:": "👍🏾", + ":+1_tone4:": "👍🏾", + ":thumbup_tone4:": "👍🏾", + ":thumbsup_tone5:": "👍🏿", + ":+1_tone5:": "👍🏿", + ":thumbup_tone5:": "👍🏿", + ":thumbsdown_tone1:": "👎🏻", + ":1_tone1:": "👎🏻", + ":thumbdown_tone1:": "👎🏻", + ":thumbsdown_tone2:": "👎🏼", + ":1_tone2:": "👎🏼", + ":thumbdown_tone2:": "👎🏼", + ":thumbsdown_tone3:": "👎🏽", + ":1_tone3:": "👎🏽", + ":thumbdown_tone3:": "👎🏽", + ":thumbsdown_tone4:": "👎🏾", + ":1_tone4:": "👎🏾", + ":thumbdown_tone4:": "👎🏾", + ":thumbsdown_tone5:": "👎🏿", + ":1_tone5:": "👎🏿", + ":thumbdown_tone5:": "👎🏿", + ":point_up_tone1:": "☝🏻", + ":point_up_tone2:": "☝🏼", + ":point_up_tone3:": "☝🏽", + ":point_up_tone4:": "☝🏾", + ":point_up_tone5:": "☝🏿", + ":point_up_2_tone1:": "👆🏻", + ":point_up_2_tone2:": "👆🏼", + ":point_up_2_tone3:": "👆🏽", + ":point_up_2_tone4:": "👆🏾", + ":point_up_2_tone5:": "👆🏿", + ":point_down_tone1:": "👇🏻", + ":point_down_tone2:": "👇🏼", + ":point_down_tone3:": "👇🏽", + ":point_down_tone4:": "👇🏾", + ":point_down_tone5:": "👇🏿", + ":point_left_tone1:": "👈🏻", + ":point_left_tone2:": "👈🏼", + ":point_left_tone3:": "👈🏽", + ":point_left_tone4:": "👈🏾", + ":point_left_tone5:": "👈🏿", + ":point_right_tone1:": "👉🏻", + ":point_right_tone2:": "👉🏼", + ":point_right_tone3:": "👉🏽", + ":point_right_tone4:": "👉🏾", + ":point_right_tone5:": "👉🏿", + ":ok_hand_tone1:": "👌🏻", + ":ok_hand_tone2:": "👌🏼", + ":water_polo_tone3:": "🤽🏽", + ":ok_hand_tone3:": "👌🏽", + ":ok_hand_tone4:": "👌🏾", + ":water_polo_tone4:": "🤽🏾", + ":ok_hand_tone5:": "👌🏿", + ":v_tone1:": "✌🏻", + ":v_tone2:": "✌🏼", + ":v_tone3:": "✌🏽", + ":v_tone4:": "✌🏾", + ":v_tone5:": "✌🏿", + ":punch_tone1:": "👊🏻", + ":punch_tone2:": "👊🏼", + ":punch_tone3:": "👊🏽", + ":punch_tone4:": "👊🏾", + ":punch_tone5:": "👊🏿", + ":fist_tone1:": "✊🏻", + ":fist_tone2:": "✊🏼", + ":fist_tone3:": "✊🏽", + ":fist_tone4:": "✊🏾", + ":fist_tone5:": "✊🏿", + ":raised_hand_tone1:": "✋🏻", + ":raised_hand_tone2:": "✋🏼", + ":raised_hand_tone3:": "✋🏽", + ":raised_hand_tone4:": "✋🏾", + ":raised_hand_tone5:": "✋🏿", + ":muscle_tone1:": "💪🏻", + ":muscle_tone2:": "💪🏼", + ":muscle_tone3:": "💪🏽", + ":muscle_tone4:": "💪🏾", + ":muscle_tone5:": "💪🏿", + ":open_hands_tone1:": "👐🏻", + ":open_hands_tone2:": "👐🏼", + ":open_hands_tone3:": "👐🏽", + ":open_hands_tone4:": "👐🏾", + ":open_hands_tone5:": "👐🏿", + ":pray_tone1:": "🙏🏻", + ":water_polo_tone5:": "🤽🏿", + ":pray_tone2:": "🙏🏼", + ":pray_tone3:": "🙏🏽", + ":handball_tone1:": "🤾🏻", + ":pray_tone4:": "🙏🏾", + ":pray_tone5:": "🙏🏿", + ":handball_tone2:": "🤾🏼", + ":runner_tone1:": "🏃🏻", + ":runner_tone2:": "🏃🏼", + ":runner_tone3:": "🏃🏽", + ":runner_tone4:": "🏃🏾", + ":handball_tone3:": "🤾🏽", + ":runner_tone5:": "🏃🏿", + ":walking_tone1:": "🚶🏻", + ":walking_tone2:": "🚶🏼", + ":walking_tone3:": "🚶🏽", + ":walking_tone4:": "🚶🏾", + ":walking_tone5:": "🚶🏿", + ":dancer_tone1:": "💃🏻", + ":handball_tone4:": "🤾🏾", + ":dancer_tone2:": "💃🏼", + ":dancer_tone3:": "💃🏽", + ":handball_tone5:": "🤾🏿", + ":dancer_tone4:": "💃🏾", + ":dancer_tone5:": "💃🏿", + ":juggling_tone1:": "🤹🏻", + ":juggler_tone1:": "🤹🏻", + ":rowboat_tone1:": "🚣🏻", + ":rowboat_tone2:": "🚣🏼", + ":rowboat_tone3:": "🚣🏽", + ":rowboat_tone4:": "🚣🏾", + ":rowboat_tone5:": "🚣🏿", + ":swimmer_tone1:": "🏊🏻", + ":swimmer_tone2:": "🏊🏼", + ":juggling_tone2:": "🤹🏼", + ":juggler_tone2:": "🤹🏼", + ":swimmer_tone3:": "🏊🏽", + ":swimmer_tone4:": "🏊🏾", + ":swimmer_tone5:": "🏊🏿", + ":juggling_tone3:": "🤹🏽", + ":juggler_tone3:": "🤹🏽", + ":surfer_tone1:": "🏄🏻", + ":surfer_tone2:": "🏄🏼", + ":surfer_tone3:": "🏄🏽", + ":surfer_tone4:": "🏄🏾", + ":surfer_tone5:": "🏄🏿", + ":bath_tone1:": "🛀🏻", + ":bath_tone2:": "🛀🏼", + ":juggling_tone4:": "🤹🏾", + ":juggler_tone4:": "🤹🏾", + ":bath_tone3:": "🛀🏽", + ":bath_tone4:": "🛀🏾", + ":bath_tone5:": "🛀🏿", + ":juggling_tone5:": "🤹🏿", + ":juggler_tone5:": "🤹🏿", + ":bicyclist_tone1:": "🚴🏻", + ":bicyclist_tone2:": "🚴🏼", + ":bicyclist_tone3:": "🚴🏽", + ":rainbow_flag:": "🏳🌈", + ":gay_pride_flag:": "🏳🌈", + ":bicyclist_tone4:": "🚴🏾", + ":bicyclist_tone5:": "🚴🏿", + ":mountain_bicyclist_tone1:": "🚵🏻", + ":mountain_bicyclist_tone2:": "🚵🏼", + ":mountain_bicyclist_tone3:": "🚵🏽", + ":mountain_bicyclist_tone4:": "🚵🏾", + ":mountain_bicyclist_tone5:": "🚵🏿", + ":horse_racing_tone1:": "🏇🏻", + ":horse_racing_tone2:": "🏇🏼", + ":horse_racing_tone3:": "🏇🏽", + ":horse_racing_tone4:": "🏇🏾", + ":horse_racing_tone5:": "🏇🏿", + ":writing_hand_tone1:": "✍🏻", + ":writing_hand_tone2:": "✍🏼", + ":writing_hand_tone3:": "✍🏽", + ":writing_hand_tone4:": "✍🏾", + ":writing_hand_tone5:": "✍🏿", + ":hand_splayed_tone1:": "🖐🏻", + ":raised_hand_with_fingers_splayed_tone1:": "🖐🏻", + ":hand_splayed_tone2:": "🖐🏼", + ":raised_hand_with_fingers_splayed_tone2:": "🖐🏼", + ":hand_splayed_tone3:": "🖐🏽", + ":raised_hand_with_fingers_splayed_tone3:": "🖐🏽", + ":hand_splayed_tone4:": "🖐🏾", + ":raised_hand_with_fingers_splayed_tone4:": "🖐🏾", + ":hand_splayed_tone5:": "🖐🏿", + ":raised_hand_with_fingers_splayed_tone5:": "🖐🏿", + ":middle_finger_tone1:": "🖕🏻", + ":reversed_hand_with_middle_finger_extended_tone1:": "🖕🏻", + ":middle_finger_tone2:": "🖕🏼", + ":reversed_hand_with_middle_finger_extended_tone2:": "🖕🏼", + ":middle_finger_tone3:": "🖕🏽", + ":reversed_hand_with_middle_finger_extended_tone3:": "🖕🏽", + ":middle_finger_tone4:": "🖕🏾", + ":reversed_hand_with_middle_finger_extended_tone4:": "🖕🏾", + ":middle_finger_tone5:": "🖕🏿", + ":reversed_hand_with_middle_finger_extended_tone5:": "🖕🏿", + ":vulcan_tone1:": "🖖🏻", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone1:": "🖖🏻", + ":vulcan_tone2:": "🖖🏼", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone2:": "🖖🏼", + ":vulcan_tone3:": "🖖🏽", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone3:": "🖖🏽", + ":vulcan_tone4:": "🖖🏾", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone4:": "🖖🏾", + ":vulcan_tone5:": "🖖🏿", + ":raised_hand_with_part_between_middle_and_ring_fingers_tone5:": "🖖🏿", + ":family_mmb:": "👨‍👨‍👦", + ":family_mmbb:": "👨‍👨‍👦‍👦", + ":family_mmg:": "👨‍👨‍👧", + ":family_mmgb:": "👨‍👨‍👧‍👦", + ":family_mmgg:": "👨‍👨‍👧‍👧", + ":family_mwbb:": "👨‍👩‍👧‍👦", + ":family_mwg:": "👨‍👩‍👧", + ":family_mwgb:": "👨‍👩‍👧‍👦", + ":family_mwgg:": "👨‍👩‍👧‍👧", + ":family_wwb:": "👩‍👩‍👦", + ":family_wwbb:": "👩‍👩‍👦‍👦", + ":family_wwg:": "👩‍👩‍👧", + ":family_wwgb:": "👩‍👩‍👧‍👦", + ":family_wwgg:": "👩‍👩‍👧‍👧", + ":couple_ww:": "👭", + ":couple_with_heart_ww:": "👩‍❤️‍👩", + ":couple_mm:": "👬", + ":couple_with_heart_mm:": "👨‍❤️‍👨", + ":kiss_ww:": "👩‍❤️‍💋‍👩", + ":couplekiss_ww:": "👩‍❤️‍💋‍👩", + ":kiss_mm:": "👨‍❤️‍💋‍👨", + ":couplekiss_mm:": "👨‍❤️‍💋‍👨", + ":tone1:": "🏻", + ":tone2:": "🏼", + ":tone3:": "🏽", + ":tone4:": "🏾", + ":tone5:": "🏿", + ":asterisk:": "ℍ", + ":keycap_asterisk:": "ℍ", + ":eject:": "⏏", + ":eject_symbol:": "⏏", + ":track_next:": "⏭", + ":next_track:": "⏭", + ":track_previous:": "⏮", + ":previous_track:": "⏮", + ":play_pause:": "⏯", + ":eye_in_speech_bubble:": "👁🗨", + ":stopwatch:": "⏱", + ":timer:": "⏲", + ":timer_clock:": "⏲", + ":pause_button:": "⏸", + ":double_vertical_bar:": "⏸", + ":stop_button:": "⏹", + ":record_button:": "⏺", + ":umbrella2:": "☂", + ":snowman2:": "☃", + ":comet:": "☄", + ":shamrock:": "☘", + ":skull_crossbones:": "☠", + ":skull_and_crossbones:": "☠", + ":radioactive:": "☢", + ":radioactive_sign:": "☢", + ":biohazard:": "☣", + ":biohazard_sign:": "☣", + ":orthodox_cross:": "☦", + ":star_and_crescent:": "☪", + ":peace:": "☮", + ":peace_symbol:": "☮", + ":yin_yang:": "☯", + ":wheel_of_dharma:": "☸", + ":frowning2:": "☹", + ":white_frowning_face:": "☹", + ":hammer_pick:": "⚒", + ":hammer_and_pick:": "⚒", + ":crossed_swords:": "⚔", + ":scales:": "⚖", + ":alembic:": "⚗", + ":gear:": "⚙", + ":atom:": "⚛", + ":atom_symbol:": "⚛", + ":fleurdelis:": "⚜", + ":coffin:": "⚰", + ":urn:": "⚱", + ":funeral_urn:": "⚱", + ":thunder_cloud_rain:": "⛈", + ":thunder_cloud_and_rain:": "⛈", + ":pick:": "⛏", + ":helmet_with_cross:": "⛑", + ":helmet_with_white_cross:": "⛑", + ":chains:": "⛓", + ":shinto_shrine:": "⛩", + ":mountain:": "⛰", + ":beach_umbrella:": "⛱", + ":umbrella_on_ground:": "⛱", + ":ferry:": "⛴", + ":skier:": "⛷", + ":ice_skate:": "⛸", + ":basketball_player:": "⛹", + ":person_with_ball:": "⛹", + ":star_of_david:": "✡", + ":heart_exclamation:": "❣", + ":heavy_heart_exclamation_mark_ornament:": "❣", + ":white_sun_small_cloud:": "🌤", + ":white_sun_with_small_cloud:": "🌤", + ":white_sun_cloud:": "🌥", + ":white_sun_behind_cloud:": "🌥", + ":white_sun_rain_cloud:": "🌦", + ":white_sun_behind_cloud_with_rain:": "🌦", + ":mouse_three_button:": "🖱", + ":three_button_mouse:": "🖱", + ":santa_tone1:": "🎅🏻", + ":santa_tone2:": "🎅🏼", + ":santa_tone3:": "🎅🏽", + ":santa_tone4:": "🎅🏾", + ":santa_tone5:": "🎅🏿", + ":metal_tone1:": "🤘🏻", + ":sign_of_the_horns_tone1:": "🤘🏻", + ":metal_tone2:": "🤘🏼", + ":sign_of_the_horns_tone2:": "🤘🏼", + ":metal_tone3:": "🤘🏽", + ":sign_of_the_horns_tone3:": "🤘🏽", + ":metal_tone4:": "🤘🏾", + ":sign_of_the_horns_tone4:": "🤘🏾", + ":metal_tone5:": "🤘🏿", + ":sign_of_the_horns_tone5:": "🤘🏿", + ":lifter_tone1:": "🏋🏻", + ":weight_lifter_tone1:": "🏋🏻", + ":lifter_tone2:": "🏋🏼", + ":weight_lifter_tone2:": "🏋🏼", + ":lifter_tone3:": "🏋🏽", + ":weight_lifter_tone3:": "🏋🏽", + ":lifter_tone4:": "🏋🏾", + ":weight_lifter_tone4:": "🏋🏾", + ":lifter_tone5:": "🏋🏿", + ":weight_lifter_tone5:": "🏋🏿", + ":basketball_player_tone1:": "⛹🏻", + ":person_with_ball_tone1:": "⛹🏻", + ":basketball_player_tone2:": "⛹🏼", + ":person_with_ball_tone2:": "⛹🏼", + ":basketball_player_tone3:": "⛹🏽", + ":person_with_ball_tone3:": "⛹🏽", + ":basketball_player_tone4:": "⛹🏾", + ":person_with_ball_tone4:": "⛹🏾", + ":basketball_player_tone5:": "⛹🏿", + ":person_with_ball_tone5:": "⛹🏿", + ":upside_down:": "🙃", + ":upside_down_face:": "🙃", + ":money_mouth:": "🤑", + ":money_mouth_face:": "🤑", + ":nerd:": "🤓", + ":nerd_face:": "🤓", + ":hugging:": "🤗", + ":hugging_face:": "🤗", + ":rolling_eyes:": "🙄", + ":face_with_rolling_eyes:": "🙄", + ":thinking:": "🤔", + ":thinking_face:": "🤔", + ":zipper_mouth:": "🤐", + ":zipper_mouth_face:": "🤐", + ":thermometer_face:": "🤒", + ":face_with_thermometer:": "🤒", + ":head_bandage:": "🤕", + ":face_with_head_bandage:": "🤕", + ":robot:": "🤖", + ":robot_face:": "🤖", + ":lion_face:": "🦁", + ":lion:": "🦁", + ":unicorn:": "🦄", + ":unicorn_face:": "🦄", + ":scorpion:": "🦂", + ":crab:": "🦀", + ":turkey:": "🦃", + ":cheese:": "🧀", + ":cheese_wedge:": "🧀", + ":hotdog:": "🌭", + ":hot_dog:": "🌭", + ":taco:": "🌮", + ":burrito:": "🌯", + ":popcorn:": "🍿", + ":champagne:": "🍾", + ":bottle_with_popping_cork:": "🍾", + ":bow_and_arrow:": "🏹", + ":archery:": "🏹", + ":amphora:": "🏺", + ":place_of_worship:": "🛐", + ":worship_symbol:": "🛐", + ":kaaba:": "🕋", + ":mosque:": "🕌", + ":synagogue:": "🕍", + ":menorah:": "🕎", + ":prayer_beads:": "📿", + ":cricket:": "🏏", + ":cricket_bat_ball:": "🏏", + ":volleyball:": "🏐", + ":field_hockey:": "🏑", + ":hockey:": "🏒", + ":ping_pong:": "🏓", + ":table_tennis:": "🏓", + ":badminton:": "🏸", + ":flag_ax:": "🇦🇽", + ":ax:": "🇦🇽", + ":flag_ta:": "🇹🇦", + ":ta:": "🇹🇦", + ":flag_io:": "🇮🇴", + ":io:": "🇮🇴", + ":flag_bq:": "🇧🇶", + ":bq:": "🇧🇶", + ":flag_cx:": "🇨🇽", + ":cx:": "🇨🇽", + ":flag_cc:": "🇨🇨", + ":cc:": "🇨🇨", + ":flag_gg:": "🇬🇬", + ":gg:": "🇬🇬", + ":flag_im:": "🇮🇲", + ":im:": "🇮🇲", + ":flag_yt:": "🇾🇹", + ":yt:": "🇾🇹", + ":flag_nf:": "🇳🇫", + ":nf:": "🇳🇫", + ":flag_pn:": "🇵🇳", + ":pn:": "🇵🇳", + ":flag_bl:": "🇧🇱", + ":bl:": "🇧🇱", + ":flag_pm:": "🇵🇲", + ":pm:": "🇵🇲", + ":flag_gs:": "🇬🇸", + ":gs:": "🇬🇸", + ":flag_tk:": "🇹🇰", + ":tk:": "🇹🇰", + ":flag_bv:": "🇧🇻", + ":bv:": "🇧🇻", + ":flag_hm:": "🇭🇲", + ":hm:": "🇭🇲", + ":flag_sj:": "🇸🇯", + ":sj:": "🇸🇯", + ":flag_um:": "🇺🇲", + ":um:": "🇺🇲", + ":flag_ic:": "🇮🇨", + ":ic:": "🇮🇨", + ":flag_ea:": "🇪🇦", + ":ea:": "🇪🇦", + ":flag_cp:": "🇨🇵", + ":cp:": "🇨🇵", + ":flag_dg:": "🇩🇬", + ":dg:": "🇩🇬", + ":flag_as:": "🇦🇸", + ":as:": "🇦🇸", + ":flag_aq:": "🇦🇶", + ":aq:": "🇦🇶", + ":flag_vg:": "🇻🇬", + ":vg:": "🇻🇬", + ":flag_ck:": "🇨🇰", + ":ck:": "🇨🇰", + ":flag_cw:": "🇨🇼", + ":cw:": "🇨🇼", + ":flag_eu:": "🇪🇺", + ":eu:": "🇪🇺", + ":flag_gf:": "🇬🇫", + ":gf:": "🇬🇫", + ":flag_tf:": "🇹🇫", + ":tf:": "🇹🇫", + ":flag_gp:": "🇬🇵", + ":gp:": "🇬🇵", + ":flag_mq:": "🇲🇶", + ":mq:": "🇲🇶", + ":flag_mp:": "🇲🇵", + ":mp:": "🇲🇵", + ":flag_re:": "🇷🇪", + ":re:": "🇷🇪", + ":flag_sx:": "🇸🇽", + ":sx:": "🇸🇽", + ":flag_ss:": "🇸🇸", + ":ss:": "🇸🇸", + ":flag_tc:": "🇹🇨", + ":tc:": "🇹🇨", + ":flag_mf:": "🇲🇫", + ":mf:": "🇲🇫", + ":spy_tone1:": "🕵🏻", + ":sleuth_or_spy_tone1:": "🕵🏻", + ":spy_tone2:": "🕵🏼", + ":sleuth_or_spy_tone2:": "🕵🏼", + ":spy_tone3:": "🕵🏽", + ":sleuth_or_spy_tone3:": "🕵🏽", + ":spy_tone4:": "🕵🏾", + ":sleuth_or_spy_tone4:": "🕵🏾", + ":spy_tone5:": "🕵🏿", + ":sleuth_or_spy_tone5:": "🕵🏿", + ":drum:": "🥁", + ":drum_with_drumsticks:": "🥁", + ":shrimp:": "🦐", + ":squid:": "🦑", + ":egg:": "🥚", + ":milk:": "🥛", + ":glass_of_milk:": "🥛", + ":peanuts:": "🥜", + ":shelled_peanut:": "🥜", + ":kiwi:": "🥝", + ":kiwifruit:": "🥝", + ":pancakes:": "🥞", + ":regional_indicator_w:": "🇼", + ":regional_indicator_v:": "🇻", + ":regional_indicator_u:": "🇺", + ":regional_indicator_t:": "🇹", + ":regional_indicator_s:": "🇸", + ":regional_indicator_r:": "🇷", + ":regional_indicator_q:": "🇶", + ":regional_indicator_p:": "🇵", + ":regional_indicator_o:": "🇴", + ":regional_indicator_n:": "🇳", + ":regional_indicator_m:": "🇲", + ":regional_indicator_l:": "🇱", + ":regional_indicator_k:": "🇰", + ":regional_indicator_j:": "🇯", + ":regional_indicator_i:": "🇮", + ":regional_indicator_h:": "🇭", + ":regional_indicator_g:": "🇬", + ":regional_indicator_f:": "🇫", + ":regional_indicator_e:": "🇪", + ":regional_indicator_d:": "🇩", + ":regional_indicator_c:": "🇨", + ":regional_indicator_b:": "🇧", + ":regional_indicator_a:": "🇦", + ":digit_nine:": "9", + ":digit_eight:": "8", + ":digit_seven:": "7", + ":digit_six:": "6", + ":digit_five:": "5", + ":digit_four:": "4", + ":digit_three:": "3", + ":digit_two:": "2", + ":digit_one:": "1", + ":digit_zero:": "0", + ":men_with_bunny_ears_partying:": "👯", + ":women_with_bunny_ears_partying:": "👯", + ":snowboarder_tone1:": "🏂🏻", + ":snowboarder_light_skin_tone:": "🏂🏻", + ":man_golfing:": "🏌", + ":man_golfing_tone1:": "🏌🏻", + ":man_golfing_light_skin_tone:": "🏌🏻", + ":man_golfing_tone2:": "🏌🏼", + ":man_golfing_medium_light_skin_tone:": "🏌🏼", + ":man_golfing_tone3:": "🏌🏽", + ":man_golfing_medium_skin_tone:": "🏌🏽", + ":man_golfing_tone4:": "🏌🏾", + ":man_golfing_medium_dark_skin_tone:": "🏌🏾", + ":man_golfing_tone5:": "🏌🏿", + ":man_golfing_dark_skin_tone:": "🏌🏿", + ":woman_golfing:": "🏌", + ":woman_golfing_tone1:": "🏌🏻", + ":woman_golfing_light_skin_tone:": "🏌🏻", + ":woman_golfing_tone2:": "🏌🏼", + ":woman_golfing_medium_light_skin_tone:": "🏌🏼", + ":woman_golfing_tone3:": "🏌🏽", + ":woman_golfing_medium_skin_tone:": "🏌🏽", + ":woman_golfing_tone4:": "🏌🏾", + ":woman_golfing_medium_dark_skin_tone:": "🏌🏾", + ":woman_golfing_tone5:": "🏌🏿", + ":woman_golfing_dark_skin_tone:": "🏌🏿", + ":men_wrestling:": "🤼", + ":women_wrestling:": "🤼", + ":man_juggling_tone5:": "🤹🏿", + ":man_juggling_dark_skin_tone:": "🤹🏿", + ":man_juggling_tone4:": "🤹🏾", + ":man_juggling_medium_dark_skin_tone:": "🤹🏾", + ":man_juggling_tone3:": "🤹🏽", + ":man_juggling_medium_skin_tone:": "🤹🏽", + ":man_juggling_tone2:": "🤹🏼", + ":man_juggling_medium_light_skin_tone:": "🤹🏼", + ":man_juggling_tone1:": "🤹🏻", + ":man_juggling_light_skin_tone:": "🤹🏻", + ":man_juggling:": "🤹", + ":woman_juggling_tone5:": "🤹🏿", + ":woman_juggling_dark_skin_tone:": "🤹🏿", + ":woman_juggling_tone4:": "🤹🏾", + ":woman_juggling_medium_dark_skin_tone:": "🤹🏾", + ":woman_juggling_tone3:": "🤹🏽", + ":woman_juggling_medium_skin_tone:": "🤹🏽", + ":woman_juggling_tone2:": "🤹🏼", + ":woman_juggling_medium_light_skin_tone:": "🤹🏼", + ":woman_juggling_tone1:": "🤹🏻", + ":woman_juggling_light_skin_tone:": "🤹🏻", + ":woman_juggling:": "🤹", + ":man_playing_handball_tone5:": "🤾🏿", + ":man_playing_handball_dark_skin_tone:": "🤾🏿", + ":man_playing_handball_tone4:": "🤾🏾", + ":man_playing_handball_medium_dark_skin_tone:": "🤾🏾", + ":man_playing_handball_tone3:": "🤾🏽", + ":man_playing_handball_medium_skin_tone:": "🤾🏽", + ":man_playing_handball_tone2:": "🤾🏼", + ":man_playing_handball_medium_light_skin_tone:": "🤾🏼", + ":man_playing_handball_tone1:": "🤾🏻", + ":man_playing_handball_light_skin_tone:": "🤾🏻", + ":man_playing_handball:": "🤾", + ":woman_playing_handball_tone5:": "🤾🏿", + ":woman_playing_handball_dark_skin_tone:": "🤾🏿", + ":woman_playing_handball_tone4:": "🤾🏾", + ":woman_playing_handball_medium_dark_skin_tone:": "🤾🏾", + ":woman_playing_handball_tone3:": "🤾🏽", + ":woman_playing_handball_medium_skin_tone:": "🤾🏽", + ":woman_playing_handball_tone2:": "🤾🏼", + ":woman_playing_handball_medium_light_skin_tone:": "🤾🏼", + ":woman_playing_handball_tone1:": "🤾🏻", + ":woman_playing_handball_light_skin_tone:": "🤾🏻", + ":woman_playing_handball:": "🤾", + ":man_playing_water_polo_tone5:": "🤽🏿", + ":man_playing_water_polo_dark_skin_tone:": "🤽🏿", + ":man_playing_water_polo_tone4:": "🤽🏾", + ":man_playing_water_polo_medium_dark_skin_tone:": "🤽🏾", + ":man_playing_water_polo_tone3:": "🤽🏽", + ":man_playing_water_polo_medium_skin_tone:": "🤽🏽", + ":man_playing_water_polo_tone2:": "🤽🏼", + ":man_playing_water_polo_medium_light_skin_tone:": "🤽🏼", + ":man_playing_water_polo_tone1:": "🤽🏻", + ":man_playing_water_polo_light_skin_tone:": "🤽🏻", + ":man_playing_water_polo:": "🤽", + ":woman_playing_water_polo_tone5:": "🤽🏿", + ":woman_playing_water_polo_dark_skin_tone:": "🤽🏿", + ":woman_playing_water_polo_tone4:": "🤽🏾", + ":woman_playing_water_polo_medium_dark_skin_tone:": "🤽🏾", + ":woman_playing_water_polo_tone3:": "🤽🏽", + ":woman_playing_water_polo_medium_skin_tone:": "🤽🏽", + ":woman_playing_water_polo_tone2:": "🤽🏼", + ":woman_playing_water_polo_medium_light_skin_tone:": "🤽🏼", + ":woman_playing_water_polo_tone1:": "🤽🏻", + ":woman_playing_water_polo_light_skin_tone:": "🤽🏻", + ":woman_playing_water_polo:": "🤽", + ":man_cartwheeling_tone5:": "🤸🏿", + ":man_cartwheeling_dark_skin_tone:": "🤸🏿", + ":man_cartwheeling_tone4:": "🤸🏾", + ":man_cartwheeling_medium_dark_skin_tone:": "🤸🏾", + ":man_cartwheeling_tone3:": "🤸🏽", + ":man_cartwheeling_medium_skin_tone:": "🤸🏽", + ":man_cartwheeling_tone2:": "🤸🏼", + ":man_cartwheeling_medium_light_skin_tone:": "🤸🏼", + ":man_cartwheeling_tone1:": "🤸🏻", + ":man_cartwheeling_light_skin_tone:": "🤸🏻", + ":man_cartwheeling:": "🤸", + ":woman_cartwheeling_tone5:": "🤸🏿", + ":woman_cartwheeling_dark_skin_tone:": "🤸🏿", + ":woman_cartwheeling_tone4:": "🤸🏾", + ":woman_cartwheeling_medium_dark_skin_tone:": "🤸🏾", + ":woman_cartwheeling_tone3:": "🤸🏽", + ":woman_cartwheeling_medium_skin_tone:": "🤸🏽", + ":woman_cartwheeling_tone2:": "🤸🏼", + ":woman_cartwheeling_medium_light_skin_tone:": "🤸🏼", + ":woman_cartwheeling_tone1:": "🤸🏻", + ":woman_cartwheeling_light_skin_tone:": "🤸🏻", + ":woman_cartwheeling:": "🤸", + ":man_walking_tone5:": "🚶🏿", + ":man_walking_dark_skin_tone:": "🚶🏿", + ":man_walking_tone4:": "🚶🏾", + ":man_walking_medium_dark_skin_tone:": "🚶🏾", + ":man_walking_tone3:": "🚶🏽", + ":man_walking_medium_skin_tone:": "🚶🏽", + ":man_walking_tone2:": "🚶🏼", + ":man_walking_medium_light_skin_tone:": "🚶🏼", + ":man_walking_tone1:": "🚶🏻", + ":man_walking_light_skin_tone:": "🚶🏻", + ":man_walking:": "🚶", + ":woman_walking_tone5:": "🚶🏿", + ":woman_walking_dark_skin_tone:": "🚶🏿", + ":woman_walking_tone4:": "🚶🏾", + ":woman_walking_medium_dark_skin_tone:": "🚶🏾", + ":woman_walking_tone3:": "🚶🏽", + ":woman_walking_medium_skin_tone:": "🚶🏽", + ":woman_walking_tone2:": "🚶🏼", + ":woman_walking_medium_light_skin_tone:": "🚶🏼", + ":woman_walking_tone1:": "🚶🏻", + ":woman_walking_light_skin_tone:": "🚶🏻", + ":woman_walking:": "🚶", + ":man_mountain_biking_tone5:": "🚵🏿", + ":man_mountain_biking_dark_skin_tone:": "🚵🏿", + ":man_mountain_biking_tone4:": "🚵🏾", + ":man_mountain_biking_medium_dark_skin_tone:": "🚵🏾", + ":man_mountain_biking_tone3:": "🚵🏽", + ":man_mountain_biking_medium_skin_tone:": "🚵🏽", + ":man_mountain_biking_tone2:": "🚵🏼", + ":man_mountain_biking_medium_light_skin_tone:": "🚵🏼", + ":man_mountain_biking_tone1:": "🚵🏻", + ":man_mountain_biking_light_skin_tone:": "🚵🏻", + ":man_mountain_biking:": "🚵", + ":woman_mountain_biking_tone5:": "🚵🏿", + ":woman_mountain_biking_dark_skin_tone:": "🚵🏿", + ":woman_mountain_biking_tone4:": "🚵🏾", + ":woman_mountain_biking_medium_dark_skin_tone:": "🚵🏾", + ":woman_mountain_biking_tone3:": "🚵🏽", + ":woman_mountain_biking_medium_skin_tone:": "🚵🏽", + ":woman_mountain_biking_tone2:": "🚵🏼", + ":woman_mountain_biking_medium_light_skin_tone:": "🚵🏼", + ":woman_mountain_biking_tone1:": "🚵🏻", + ":woman_mountain_biking_light_skin_tone:": "🚵🏻", + ":woman_mountain_biking:": "🚵", + ":man_biking_tone5:": "🚴🏿", + ":man_biking_dark_skin_tone:": "🚴🏿", + ":man_biking_tone4:": "🚴🏾", + ":man_biking_medium_dark_skin_tone:": "🚴🏾", + ":man_biking_tone3:": "🚴🏽", + ":man_biking_medium_skin_tone:": "🚴🏽", + ":man_biking_tone2:": "🚴🏼", + ":man_biking_medium_light_skin_tone:": "🚴🏼", + ":man_biking_tone1:": "🚴🏻", + ":man_biking_light_skin_tone:": "🚴🏻", + ":man_biking:": "🚴", + ":woman_biking_tone5:": "🚴🏿", + ":woman_biking_dark_skin_tone:": "🚴🏿", + ":woman_biking_tone4:": "🚴🏾", + ":woman_biking_medium_dark_skin_tone:": "🚴🏾", + ":woman_biking_tone3:": "🚴🏽", + ":woman_biking_medium_skin_tone:": "🚴🏽", + ":woman_biking_tone2:": "🚴🏼", + ":woman_biking_medium_light_skin_tone:": "🚴🏼", + ":woman_biking_tone1:": "🚴🏻", + ":woman_biking_light_skin_tone:": "🚴🏻", + ":woman_biking:": "🚴", + ":man_rowing_boat_tone5:": "🚣🏿", + ":man_rowing_boat_dark_skin_tone:": "🚣🏿", + ":man_rowing_boat_tone4:": "🚣🏾", + ":man_rowing_boat_medium_dark_skin_tone:": "🚣🏾", + ":man_rowing_boat_tone3:": "🚣🏽", + ":man_rowing_boat_medium_skin_tone:": "🚣🏽", + ":man_rowing_boat_tone2:": "🚣🏼", + ":man_rowing_boat_medium_light_skin_tone:": "🚣🏼", + ":man_rowing_boat_tone1:": "🚣🏻", + ":man_rowing_boat_light_skin_tone:": "🚣🏻", + ":man_rowing_boat:": "🚣", + ":woman_rowing_boat_tone5:": "🚣🏿", + ":woman_rowing_boat_dark_skin_tone:": "🚣🏿", + ":woman_rowing_boat_tone4:": "🚣🏾", + ":woman_rowing_boat_medium_dark_skin_tone:": "🚣🏾", + ":woman_rowing_boat_tone3:": "🚣🏽", + ":woman_rowing_boat_medium_skin_tone:": "🚣🏽", + ":woman_rowing_boat_tone2:": "🚣🏼", + ":woman_rowing_boat_medium_light_skin_tone:": "🚣🏼", + ":woman_rowing_boat_tone1:": "🚣🏻", + ":woman_rowing_boat_light_skin_tone:": "🚣🏻", + ":woman_rowing_boat:": "🚣", + ":man_lifting_weights_tone5:": "🏋🏿", + ":man_lifting_weights_dark_skin_tone:": "🏋🏿", + ":man_lifting_weights_tone4:": "🏋🏾", + ":man_lifting_weights_medium_dark_skin_tone:": "🏋🏾", + ":man_lifting_weights_tone3:": "🏋🏽", + ":man_lifting_weights_medium_skin_tone:": "🏋🏽", + ":man_lifting_weights_tone2:": "🏋🏼", + ":man_lifting_weights_medium_light_skin_tone:": "🏋🏼", + ":man_lifting_weights_tone1:": "🏋🏻", + ":man_lifting_weights_light_skin_tone:": "🏋🏻", + ":man_lifting_weights:": "🏋", + ":woman_lifting_weights_tone5:": "🏋🏿", + ":woman_lifting_weights_dark_skin_tone:": "🏋🏿", + ":woman_lifting_weights_tone4:": "🏋🏾", + ":woman_lifting_weights_medium_dark_skin_tone:": "🏋🏾", + ":woman_lifting_weights_tone3:": "🏋🏽", + ":woman_lifting_weights_medium_skin_tone:": "🏋🏽", + ":woman_lifting_weights_tone2:": "🏋🏼", + ":woman_lifting_weights_medium_light_skin_tone:": "🏋🏼", + ":woman_lifting_weights_tone1:": "🏋🏻", + ":woman_lifting_weights_light_skin_tone:": "🏋🏻", + ":woman_lifting_weights:": "🏋", + ":man_swimming_tone5:": "🏊🏿", + ":man_swimming_dark_skin_tone:": "🏊🏿", + ":man_swimming_tone4:": "🏊🏾", + ":man_swimming_medium_dark_skin_tone:": "🏊🏾", + ":man_swimming_tone3:": "🏊🏽", + ":man_swimming_medium_skin_tone:": "🏊🏽", + ":man_swimming_tone2:": "🏊🏼", + ":man_swimming_medium_light_skin_tone:": "🏊🏼", + ":man_swimming_tone1:": "🏊🏻", + ":man_swimming_light_skin_tone:": "🏊🏻", + ":man_swimming:": "🏊", + ":woman_swimming_tone5:": "🏊🏿", + ":woman_swimming_dark_skin_tone:": "🏊🏿", + ":woman_swimming_tone4:": "🏊🏾", + ":woman_swimming_medium_dark_skin_tone:": "🏊🏾", + ":woman_swimming_tone3:": "🏊🏽", + ":woman_swimming_medium_skin_tone:": "🏊🏽", + ":woman_swimming_tone2:": "🏊🏼", + ":woman_swimming_medium_light_skin_tone:": "🏊🏼", + ":woman_swimming_tone1:": "🏊🏻", + ":woman_swimming_light_skin_tone:": "🏊🏻", + ":woman_swimming:": "🏊", + ":man_surfing_tone5:": "🏄🏿", + ":man_surfing_dark_skin_tone:": "🏄🏿", + ":man_surfing_tone4:": "🏄🏾", + ":man_surfing_medium_dark_skin_tone:": "🏄🏾", + ":man_surfing_tone3:": "🏄🏽", + ":man_surfing_medium_skin_tone:": "🏄🏽", + ":man_surfing_tone2:": "🏄🏼", + ":man_surfing_medium_light_skin_tone:": "🏄🏼", + ":man_surfing_tone1:": "🏄🏻", + ":man_surfing_light_skin_tone:": "🏄🏻", + ":man_surfing:": "🏄", + ":woman_surfing_tone5:": "🏄🏿", + ":woman_surfing_dark_skin_tone:": "🏄🏿", + ":woman_surfing_tone4:": "🏄🏾", + ":woman_surfing_medium_dark_skin_tone:": "🏄🏾", + ":woman_surfing_tone3:": "🏄🏽", + ":woman_surfing_medium_skin_tone:": "🏄🏽", + ":woman_surfing_tone2:": "🏄🏼", + ":woman_surfing_medium_light_skin_tone:": "🏄🏼", + ":woman_surfing_tone1:": "🏄🏻", + ":woman_surfing_light_skin_tone:": "🏄🏻", + ":woman_surfing:": "🏄", + ":man_running_tone5:": "🏃🏿", + ":man_running_dark_skin_tone:": "🏃🏿", + ":man_running_tone4:": "🏃🏾", + ":man_running_medium_dark_skin_tone:": "🏃🏾", + ":man_running_tone3:": "🏃🏽", + ":man_running_medium_skin_tone:": "🏃🏽", + ":man_running_tone2:": "🏃🏼", + ":man_running_medium_light_skin_tone:": "🏃🏼", + ":man_running_tone1:": "🏃🏻", + ":man_running_light_skin_tone:": "🏃🏻", + ":man_running:": "🏃", + ":woman_running_tone5:": "🏃🏿", + ":woman_running_dark_skin_tone:": "🏃🏿", + ":woman_running_tone4:": "🏃🏾", + ":woman_running_medium_dark_skin_tone:": "🏃🏾", + ":woman_running_tone3:": "🏃🏽", + ":woman_running_medium_skin_tone:": "🏃🏽", + ":woman_running_tone2:": "🏃🏼", + ":woman_running_medium_light_skin_tone:": "🏃🏼", + ":woman_running_tone1:": "🏃🏻", + ":woman_running_light_skin_tone:": "🏃🏻", + ":woman_running:": "🏃", + ":man_bouncing_ball_tone5:": "𓢞", + ":man_bouncing_ball_dark_skin_tone:": "𓢞", + ":man_bouncing_ball_tone4:": "𒢞", + ":man_bouncing_ball_medium_dark_skin_tone:": "𒢞", + ":man_bouncing_ball_tone3:": "𑢞", + ":man_bouncing_ball_medium_skin_tone:": "𑢞", + ":man_bouncing_ball_tone2:": "𐢞", + ":man_bouncing_ball_medium_light_skin_tone:": "𐢞", + ":man_bouncing_ball_tone1:": "", + ":man_bouncing_ball_light_skin_tone:": "", + ":man_bouncing_ball:": "䴻", + ":woman_bouncing_ball_tone5:": "𓢜", + ":woman_bouncing_ball_dark_skin_tone:": "𓢜", + ":woman_bouncing_ball_tone4:": "𒢜", + ":woman_bouncing_ball_medium_dark_skin_tone:": "𒢜", + ":woman_bouncing_ball_tone3:": "𑢜", + ":woman_bouncing_ball_medium_skin_tone:": "𑢜", + ":woman_bouncing_ball_tone2:": "𐢜", + ":woman_bouncing_ball_medium_light_skin_tone:": "𐢜", + ":woman_bouncing_ball_tone1:": "", + ":woman_bouncing_ball_light_skin_tone:": "", + ":woman_bouncing_ball:": "䴹", + ":man_shrugging_tone5:": "🤷🏿", + ":man_shrugging_dark_skin_tone:": "🤷🏿", + ":man_shrugging_tone4:": "🤷🏾", + ":man_shrugging_medium_dark_skin_tone:": "🤷🏾", + ":man_shrugging_tone3:": "🤷🏽", + ":man_shrugging_medium_skin_tone:": "🤷🏽", + ":man_shrugging_tone2:": "🤷🏼", + ":man_shrugging_medium_light_skin_tone:": "🤷🏼", + ":man_shrugging_tone1:": "🤷🏻", + ":man_shrugging_light_skin_tone:": "🤷🏻", + ":man_shrugging:": "🤷", + ":woman_shrugging_tone5:": "🤷🏿", + ":woman_shrugging_dark_skin_tone:": "🤷🏿", + ":woman_shrugging_tone4:": "🤷🏾", + ":woman_shrugging_medium_dark_skin_tone:": "🤷🏾", + ":woman_shrugging_tone3:": "🤷🏽", + ":woman_shrugging_medium_skin_tone:": "🤷🏽", + ":woman_shrugging_tone2:": "🤷🏼", + ":woman_shrugging_medium_light_skin_tone:": "🤷🏼", + ":woman_shrugging_tone1:": "🤷🏻", + ":woman_shrugging_light_skin_tone:": "🤷🏻", + ":woman_shrugging:": "🤷", + ":man_facepalming_tone5:": "🤦🏿", + ":man_facepalming_dark_skin_tone:": "🤦🏿", + ":man_facepalming_tone4:": "🤦🏾", + ":man_facepalming_medium_dark_skin_tone:": "🤦🏾", + ":man_facepalming_tone3:": "🤦🏽", + ":man_facepalming_medium_skin_tone:": "🤦🏽", + ":man_facepalming_tone2:": "🤦🏼", + ":man_facepalming_medium_light_skin_tone:": "🤦🏼", + ":man_facepalming_tone1:": "🤦🏻", + ":man_facepalming_light_skin_tone:": "🤦🏻", + ":man_facepalming:": "🤦", + ":woman_facepalming_tone5:": "🤦🏿", + ":woman_facepalming_dark_skin_tone:": "🤦🏿", + ":woman_facepalming_tone4:": "🤦🏾", + ":woman_facepalming_medium_dark_skin_tone:": "🤦🏾", + ":woman_facepalming_tone3:": "🤦🏽", + ":woman_facepalming_medium_skin_tone:": "🤦🏽", + ":woman_facepalming_tone2:": "🤦🏼", + ":woman_facepalming_medium_light_skin_tone:": "🤦🏼", + ":woman_facepalming_tone1:": "🤦🏻", + ":woman_facepalming_light_skin_tone:": "🤦🏻", + ":woman_facepalming:": "🤦", + ":man_pouting_tone5:": "🙎🏿", + ":man_pouting_dark_skin_tone:": "🙎🏿", + ":man_pouting_tone4:": "🙎🏾", + ":man_pouting_medium_dark_skin_tone:": "🙎🏾", + ":man_pouting_tone3:": "🙎🏽", + ":man_pouting_medium_skin_tone:": "🙎🏽", + ":man_pouting_tone2:": "🙎🏼", + ":man_pouting_medium_light_skin_tone:": "🙎🏼", + ":man_pouting_tone1:": "🙎🏻", + ":man_pouting_light_skin_tone:": "🙎🏻", + ":man_pouting:": "🙎", + ":woman_pouting_tone5:": "🙎🏿", + ":woman_pouting_dark_skin_tone:": "🙎🏿", + ":woman_pouting_tone4:": "🙎🏾", + ":woman_pouting_medium_dark_skin_tone:": "🙎🏾", + ":woman_pouting_tone3:": "🙎🏽", + ":woman_pouting_medium_skin_tone:": "🙎🏽", + ":woman_pouting_tone2:": "🙎🏼", + ":woman_pouting_medium_light_skin_tone:": "🙎🏼", + ":woman_pouting_tone1:": "🙎🏻", + ":woman_pouting_light_skin_tone:": "🙎🏻", + ":woman_pouting:": "🙎", + ":man_frowning_tone5:": "🙍🏿", + ":man_frowning_dark_skin_tone:": "🙍🏿", + ":man_frowning_tone4:": "🙍🏾", + ":man_frowning_medium_dark_skin_tone:": "🙍🏾", + ":man_frowning_tone3:": "🙍🏽", + ":man_frowning_medium_skin_tone:": "🙍🏽", + ":man_frowning_tone2:": "🙍🏼", + ":man_frowning_medium_light_skin_tone:": "🙍🏼", + ":man_frowning_tone1:": "🙍🏻", + ":man_frowning_light_skin_tone:": "🙍🏻", + ":man_frowning:": "🙍", + ":woman_frowning_tone5:": "🙍🏿", + ":woman_frowning_dark_skin_tone:": "🙍🏿", + ":woman_frowning_tone4:": "🙍🏾", + ":woman_frowning_medium_dark_skin_tone:": "🙍🏾", + ":woman_frowning_tone3:": "🙍🏽", + ":woman_frowning_medium_skin_tone:": "🙍🏽", + ":woman_frowning_tone2:": "🙍🏼", + ":woman_frowning_medium_light_skin_tone:": "🙍🏼", + ":woman_frowning_tone1:": "🙍🏻", + ":woman_frowning_light_skin_tone:": "🙍🏻", + ":woman_frowning:": "🙍", + ":man_raising_hand_tone5:": "🙋🏿", + ":man_raising_hand_dark_skin_tone:": "🙋🏿", + ":man_raising_hand_tone4:": "🙋🏾", + ":man_raising_hand_medium_dark_skin_tone:": "🙋🏾", + ":man_raising_hand_tone3:": "🙋🏽", + ":man_raising_hand_medium_skin_tone:": "🙋🏽", + ":man_raising_hand_tone2:": "🙋🏼", + ":man_raising_hand_medium_light_skin_tone:": "🙋🏼", + ":man_raising_hand_tone1:": "🙋🏻", + ":man_raising_hand_light_skin_tone:": "🙋🏻", + ":man_raising_hand:": "🙋", + ":woman_raising_hand_tone5:": "🙋🏿", + ":woman_raising_hand_dark_skin_tone:": "🙋🏿", + ":woman_raising_hand_tone4:": "🙋🏾", + ":woman_raising_hand_medium_dark_skin_tone:": "🙋🏾", + ":woman_raising_hand_tone3:": "🙋🏽", + ":woman_raising_hand_medium_skin_tone:": "🙋🏽", + ":woman_raising_hand_tone2:": "🙋🏼", + ":woman_raising_hand_medium_light_skin_tone:": "🙋🏼", + ":woman_raising_hand_tone1:": "🙋🏻", + ":woman_raising_hand_light_skin_tone:": "🙋🏻", + ":woman_raising_hand:": "🙋", + ":man_bowing_tone5:": "🙇🏿", + ":man_bowing_dark_skin_tone:": "🙇🏿", + ":man_bowing_tone4:": "🙇🏾", + ":man_bowing_medium_dark_skin_tone:": "🙇🏾", + ":man_bowing_tone3:": "🙇🏽", + ":man_bowing_medium_skin_tone:": "🙇🏽", + ":man_bowing_tone2:": "🙇🏼", + ":man_bowing_medium_light_skin_tone:": "🙇🏼", + ":man_bowing_tone1:": "🙇🏻", + ":man_bowing_light_skin_tone:": "🙇🏻", + ":man_bowing:": "🙇", + ":woman_bowing_tone5:": "🙇🏿", + ":woman_bowing_dark_skin_tone:": "🙇🏿", + ":woman_bowing_tone4:": "🙇🏾", + ":woman_bowing_medium_dark_skin_tone:": "🙇🏾", + ":woman_bowing_tone3:": "🙇🏽", + ":woman_bowing_medium_skin_tone:": "🙇🏽", + ":woman_bowing_tone2:": "🙇🏼", + ":woman_bowing_medium_light_skin_tone:": "🙇🏼", + ":woman_bowing_tone1:": "🙇🏻", + ":woman_bowing_light_skin_tone:": "🙇🏻", + ":woman_bowing:": "🙇", + ":man_gesturing_ok_tone5:": "🙆🏿", + ":man_gesturing_ok_dark_skin_tone:": "🙆🏿", + ":man_gesturing_ok_tone4:": "🙆🏾", + ":man_gesturing_ok_medium_dark_skin_tone:": "🙆🏾", + ":man_gesturing_ok_tone3:": "🙆🏽", + ":man_gesturing_ok_medium_skin_tone:": "🙆🏽", + ":man_gesturing_ok_tone2:": "🙆🏼", + ":man_gesturing_ok_medium_light_skin_tone:": "🙆🏼", + ":man_gesturing_ok_tone1:": "🙆🏻", + ":man_gesturing_ok_light_skin_tone:": "🙆🏻", + ":man_gesturing_ok:": "🙆", + ":woman_gesturing_ok_tone5:": "🙆🏿", + ":woman_gesturing_ok_dark_skin_tone:": "🙆🏿", + ":woman_gesturing_ok_tone4:": "🙆🏾", + ":woman_gesturing_ok_medium_dark_skin_tone:": "🙆🏾", + ":woman_gesturing_ok_tone3:": "🙆🏽", + ":woman_gesturing_ok_medium_skin_tone:": "🙆🏽", + ":woman_gesturing_ok_tone2:": "🙆🏼", + ":woman_gesturing_ok_medium_light_skin_tone:": "🙆🏼", + ":woman_gesturing_ok_tone1:": "🙆🏻", + ":woman_gesturing_ok_light_skin_tone:": "🙆🏻", + ":woman_gesturing_ok:": "🙆", + ":man_gesturing_no_tone5:": "🙅🏿", + ":man_gesturing_no_dark_skin_tone:": "🙅🏿", + ":man_gesturing_no_tone4:": "🙅🏾", + ":man_gesturing_no_medium_dark_skin_tone:": "🙅🏾", + ":man_gesturing_no_tone3:": "🙅🏽", + ":man_gesturing_no_medium_skin_tone:": "🙅🏽", + ":man_gesturing_no_tone2:": "🙅🏼", + ":man_gesturing_no_medium_light_skin_tone:": "🙅🏼", + ":man_gesturing_no_tone1:": "🙅🏻", + ":man_gesturing_no_light_skin_tone:": "🙅🏻", + ":man_gesturing_no:": "🙅", + ":woman_gesturing_no_tone5:": "🙅🏿", + ":woman_gesturing_no_dark_skin_tone:": "🙅🏿", + ":woman_gesturing_no_tone4:": "🙅🏾", + ":woman_gesturing_no_medium_dark_skin_tone:": "🙅🏾", + ":woman_gesturing_no_tone3:": "🙅🏽", + ":woman_gesturing_no_medium_skin_tone:": "🙅🏽", + ":woman_gesturing_no_tone2:": "🙅🏼", + ":woman_gesturing_no_medium_light_skin_tone:": "🙅🏼", + ":woman_gesturing_no_tone1:": "🙅🏻", + ":woman_gesturing_no_light_skin_tone:": "🙅🏻", + ":woman_gesturing_no:": "🙅", + ":man_getting_haircut_tone5:": "💇🏿", + ":man_getting_haircut_dark_skin_tone:": "💇🏿", + ":man_getting_haircut_tone4:": "💇🏾", + ":man_getting_haircut_medium_dark_skin_tone:": "💇🏾", + ":man_getting_haircut_tone3:": "💇🏽", + ":man_getting_haircut_medium_skin_tone:": "💇🏽", + ":man_getting_haircut_tone2:": "💇🏼", + ":man_getting_haircut_medium_light_skin_tone:": "💇🏼", + ":man_getting_haircut_tone1:": "💇🏻", + ":man_getting_haircut_light_skin_tone:": "💇🏻", + ":man_getting_haircut:": "💇", + ":woman_getting_haircut_tone5:": "💇🏿", + ":woman_getting_haircut_dark_skin_tone:": "💇🏿", + ":woman_getting_haircut_tone4:": "💇🏾", + ":woman_getting_haircut_medium_dark_skin_tone:": "💇🏾", + ":woman_getting_haircut_tone3:": "💇🏽", + ":woman_getting_haircut_medium_skin_tone:": "💇🏽", + ":woman_getting_haircut_tone2:": "💇🏼", + ":woman_getting_haircut_medium_light_skin_tone:": "💇🏼", + ":woman_getting_haircut_tone1:": "💇🏻", + ":woman_getting_haircut_light_skin_tone:": "💇🏻", + ":woman_getting_haircut:": "💇", + ":man_getting_face_massage_tone5:": "💆🏿", + ":man_getting_face_massage_dark_skin_tone:": "💆🏿", + ":man_getting_face_massage_tone4:": "💆🏾", + ":man_getting_face_massage_medium_dark_skin_tone:": "💆🏾", + ":man_getting_face_massage_tone3:": "💆🏽", + ":man_getting_face_massage_medium_skin_tone:": "💆🏽", + ":man_getting_face_massage_tone2:": "💆🏼", + ":man_getting_face_massage_medium_light_skin_tone:": "💆🏼", + ":man_getting_face_massage_tone1:": "💆🏻", + ":man_getting_face_massage_light_skin_tone:": "💆🏻", + ":man_getting_face_massage:": "💆", + ":woman_getting_face_massage_tone5:": "💆🏿", + ":woman_getting_face_massage_dark_skin_tone:": "💆🏿", + ":woman_getting_face_massage_tone4:": "💆🏾", + ":woman_getting_face_massage_medium_dark_skin_tone:": "💆🏾", + ":woman_getting_face_massage_tone3:": "💆🏽", + ":woman_getting_face_massage_medium_skin_tone:": "💆🏽", + ":woman_getting_face_massage_tone2:": "💆🏼", + ":woman_getting_face_massage_medium_light_skin_tone:": "💆🏼", + ":woman_getting_face_massage_tone1:": "💆🏻", + ":woman_getting_face_massage_light_skin_tone:": "💆🏻", + ":woman_getting_face_massage:": "💆", + ":man_tipping_hand_tone5:": "💁🏿", + ":man_tipping_hand_dark_skin_tone:": "💁🏿", + ":man_tipping_hand_tone4:": "💁🏾", + ":man_tipping_hand_medium_dark_skin_tone:": "💁🏾", + ":man_tipping_hand_tone3:": "💁🏽", + ":man_tipping_hand_medium_skin_tone:": "💁🏽", + ":man_tipping_hand_tone2:": "💁🏼", + ":man_tipping_hand_medium_light_skin_tone:": "💁🏼", + ":man_tipping_hand_tone1:": "💁🏻", + ":man_tipping_hand_light_skin_tone:": "💁🏻", + ":man_tipping_hand:": "💁", + ":woman_tipping_hand_tone5:": "💁🏿", + ":woman_tipping_hand_dark_skin_tone:": "💁🏿", + ":woman_tipping_hand_tone4:": "💁🏾", + ":woman_tipping_hand_medium_dark_skin_tone:": "💁🏾", + ":woman_tipping_hand_tone3:": "💁🏽", + ":woman_tipping_hand_medium_skin_tone:": "💁🏽", + ":woman_tipping_hand_tone2:": "💁🏼", + ":woman_tipping_hand_medium_light_skin_tone:": "💁🏼", + ":woman_tipping_hand_tone1:": "💁🏻", + ":woman_tipping_hand_light_skin_tone:": "💁🏻", + ":woman_tipping_hand:": "💁", + ":blondhaired_man_tone5:": "👱🏿", + ":blondhaired_man_dark_skin_tone:": "👱🏿", + ":blondhaired_man_tone4:": "👱🏾", + ":blondhaired_man_medium_dark_skin_tone:": "👱🏾", + ":blondhaired_man_tone3:": "👱🏽", + ":blondhaired_man_medium_skin_tone:": "👱🏽", + ":blondhaired_man_tone2:": "👱🏼", + ":blondhaired_man_medium_light_skin_tone:": "👱🏼", + ":blondhaired_man_tone1:": "👱🏻", + ":blondhaired_man_light_skin_tone:": "👱🏻", + ":blondhaired_man:": "👱", + ":blondhaired_woman_tone5:": "👱🏿", + ":blondhaired_woman_dark_skin_tone:": "👱🏿", + ":blondhaired_woman_tone4:": "👱🏾", + ":blondhaired_woman_medium_dark_skin_tone:": "👱🏾", + ":blondhaired_woman_tone3:": "👱🏽", + ":blondhaired_woman_medium_skin_tone:": "👱🏽", + ":blondhaired_woman_tone2:": "👱🏼", + ":blondhaired_woman_medium_light_skin_tone:": "👱🏼", + ":blondhaired_woman_tone1:": "👱🏻", + ":blondhaired_woman_light_skin_tone:": "👱🏻", + ":blondhaired_woman:": "👱", + ":man_wearing_turban_tone5:": "👳🏿", + ":man_wearing_turban_dark_skin_tone:": "👳🏿", + ":man_wearing_turban_tone4:": "👳🏾", + ":man_wearing_turban_medium_dark_skin_tone:": "👳🏾", + ":man_wearing_turban_tone3:": "👳🏽", + ":man_wearing_turban_medium_skin_tone:": "👳🏽", + ":man_wearing_turban_tone2:": "👳🏼", + ":man_wearing_turban_medium_light_skin_tone:": "👳🏼", + ":man_wearing_turban_tone1:": "👳🏻", + ":man_wearing_turban_light_skin_tone:": "👳🏻", + ":man_wearing_turban:": "👳", + ":woman_wearing_turban_tone5:": "👳🏿", + ":woman_wearing_turban_dark_skin_tone:": "👳🏿", + ":woman_wearing_turban_tone4:": "👳🏾", + ":woman_wearing_turban_medium_dark_skin_tone:": "👳🏾", + ":woman_wearing_turban_tone3:": "👳🏽", + ":woman_wearing_turban_medium_skin_tone:": "👳🏽", + ":woman_wearing_turban_tone2:": "👳🏼", + ":woman_wearing_turban_medium_light_skin_tone:": "👳🏼", + ":woman_wearing_turban_tone1:": "👳🏻", + ":woman_wearing_turban_light_skin_tone:": "👳🏻", + ":woman_wearing_turban:": "👳", + ":man_guard_tone5:": "💂🏿", + ":man_guard_dark_skin_tone:": "💂🏿", + ":man_guard_tone4:": "💂🏾", + ":man_guard_medium_dark_skin_tone:": "💂🏾", + ":man_guard_tone3:": "💂🏽", + ":man_guard_medium_skin_tone:": "💂🏽", + ":man_guard_tone2:": "💂🏼", + ":man_guard_medium_light_skin_tone:": "💂🏼", + ":man_guard_tone1:": "💂🏻", + ":man_guard_light_skin_tone:": "💂🏻", + ":man_guard:": "💂", + ":woman_guard_tone5:": "💂🏿", + ":woman_guard_dark_skin_tone:": "💂🏿", + ":woman_guard_tone4:": "💂🏾", + ":woman_guard_medium_dark_skin_tone:": "💂🏾", + ":woman_guard_tone3:": "💂🏽", + ":woman_guard_medium_skin_tone:": "💂🏽", + ":woman_guard_tone2:": "💂🏼", + ":woman_guard_medium_light_skin_tone:": "💂🏼", + ":woman_guard_tone1:": "💂🏻", + ":woman_guard_light_skin_tone:": "💂🏻", + ":woman_guard:": "💂", + ":man_detective_tone5:": "🕵🏿", + ":man_detective_dark_skin_tone:": "🕵🏿", + ":man_detective_tone4:": "🕵🏾", + ":man_detective_medium_dark_skin_tone:": "🕵🏾", + ":man_detective_tone3:": "🕵🏽", + ":man_detective_medium_skin_tone:": "🕵🏽", + ":man_detective_tone2:": "🕵🏼", + ":man_detective_medium_light_skin_tone:": "🕵🏼", + ":man_detective_tone1:": "🕵🏻", + ":man_detective_light_skin_tone:": "🕵🏻", + ":man_detective:": "🕵", + ":woman_detective_tone5:": "🕵🏿", + ":woman_detective_dark_skin_tone:": "🕵🏿", + ":woman_detective_tone4:": "🕵🏾", + ":woman_detective_medium_dark_skin_tone:": "🕵🏾", + ":woman_detective_tone3:": "🕵🏽", + ":woman_detective_medium_skin_tone:": "🕵🏽", + ":woman_detective_tone2:": "🕵🏼", + ":woman_detective_medium_light_skin_tone:": "🕵🏼", + ":woman_detective_tone1:": "🕵🏻", + ":woman_detective_light_skin_tone:": "🕵🏻", + ":woman_detective:": "🕵", + ":man_construction_worker_tone5:": "👷🏿", + ":man_construction_worker_dark_skin_tone:": "👷🏿", + ":man_construction_worker_tone4:": "👷🏾", + ":man_construction_worker_medium_dark_skin_tone:": "👷🏾", + ":man_construction_worker_tone3:": "👷🏽", + ":man_construction_worker_medium_skin_tone:": "👷🏽", + ":man_construction_worker_tone2:": "👷🏼", + ":man_construction_worker_medium_light_skin_tone:": "👷🏼", + ":man_construction_worker_tone1:": "👷🏻", + ":man_construction_worker_light_skin_tone:": "👷🏻", + ":man_construction_worker:": "👷", + ":woman_construction_worker_tone5:": "👷🏿", + ":woman_construction_worker_dark_skin_tone:": "👷🏿", + ":woman_construction_worker_tone4:": "👷🏾", + ":woman_construction_worker_medium_dark_skin_tone:": "👷🏾", + ":woman_construction_worker_tone3:": "👷🏽", + ":woman_construction_worker_medium_skin_tone:": "👷🏽", + ":woman_construction_worker_tone2:": "👷🏼", + ":woman_construction_worker_medium_light_skin_tone:": "👷🏼", + ":woman_construction_worker_tone1:": "👷🏻", + ":woman_construction_worker_light_skin_tone:": "👷🏻", + ":woman_construction_worker:": "👷", + ":man_police_officer_tone5:": "👮🏿", + ":man_police_officer_dark_skin_tone:": "👮🏿", + ":man_police_officer_tone4:": "👮🏾", + ":man_police_officer_medium_dark_skin_tone:": "👮🏾", + ":man_police_officer_tone3:": "👮🏽", + ":man_police_officer_medium_skin_tone:": "👮🏽", + ":man_police_officer_tone2:": "👮🏼", + ":man_police_officer_medium_light_skin_tone:": "👮🏼", + ":man_police_officer_tone1:": "👮🏻", + ":man_police_officer_light_skin_tone:": "👮🏻", + ":man_police_officer:": "👮", + ":woman_police_officer_tone5:": "👮🏿", + ":woman_police_officer_dark_skin_tone:": "👮🏿", + ":woman_police_officer_tone4:": "👮🏾", + ":woman_police_officer_medium_dark_skin_tone:": "👮🏾", + ":woman_police_officer_tone3:": "👮🏽", + ":woman_police_officer_medium_skin_tone:": "👮🏽", + ":woman_police_officer_tone2:": "👮🏼", + ":woman_police_officer_medium_light_skin_tone:": "👮🏼", + ":woman_police_officer_tone1:": "👮🏻", + ":woman_police_officer_light_skin_tone:": "👮🏻", + ":woman_police_officer:": "👮", + ":man_technologist_tone5:": "👨🏿💻", + ":man_technologist_dark_skin_tone:": "👨🏿💻", + ":man_technologist_tone4:": "👨🏾💻", + ":man_technologist_medium_dark_skin_tone:": "👨🏾💻", + ":man_technologist_tone3:": "👨🏽💻", + ":man_technologist_medium_skin_tone:": "👨🏽💻", + ":man_technologist_tone2:": "👨🏼💻", + ":man_technologist_medium_light_skin_tone:": "👨🏼💻", + ":man_technologist_tone1:": "👨🏻💻", + ":man_technologist_light_skin_tone:": "👨🏻💻", + ":man_technologist:": "👨💻", + ":woman_technologist_tone5:": "👩🏿💻", + ":woman_technologist_dark_skin_tone:": "👩🏿💻", + ":woman_technologist_tone4:": "👩🏾💻", + ":woman_technologist_medium_dark_skin_tone:": "👩🏾💻", + ":woman_technologist_tone3:": "👩🏽💻", + ":woman_technologist_medium_skin_tone:": "👩🏽💻", + ":woman_technologist_tone2:": "👩🏼💻", + ":woman_technologist_medium_light_skin_tone:": "👩🏼💻", + ":woman_technologist_tone1:": "👩🏻💻", + ":woman_technologist_light_skin_tone:": "👩🏻💻", + ":woman_technologist:": "👩💻", + ":man_teacher_tone5:": "👨🏿🏫", + ":man_teacher_dark_skin_tone:": "👨🏿🏫", + ":man_teacher_tone4:": "👨🏾🏫", + ":man_teacher_medium_dark_skin_tone:": "👨🏾🏫", + ":man_teacher_tone3:": "👨🏽🏫", + ":man_teacher_medium_skin_tone:": "👨🏽🏫", + ":man_teacher_tone2:": "👨🏼🏫", + ":man_teacher_medium_light_skin_tone:": "👨🏼🏫", + ":man_teacher_tone1:": "👨🏻🏫", + ":man_teacher_light_skin_tone:": "👨🏻🏫", + ":man_teacher:": "👨🏫", + ":woman_teacher_tone5:": "👩🏿🏫", + ":woman_teacher_dark_skin_tone:": "👩🏿🏫", + ":woman_teacher_tone4:": "👩🏾🏫", + ":woman_teacher_medium_dark_skin_tone:": "👩🏾🏫", + ":woman_teacher_tone3:": "👩🏽🏫", + ":woman_teacher_medium_skin_tone:": "👩🏽🏫", + ":woman_teacher_tone2:": "👩🏼🏫", + ":woman_teacher_medium_light_skin_tone:": "👩🏼🏫", + ":woman_teacher_tone1:": "👩🏻🏫", + ":woman_teacher_light_skin_tone:": "👩🏻🏫", + ":woman_teacher:": "👩🏫", + ":man_student_tone5:": "👨🏿🎓", + ":man_student_dark_skin_tone:": "👨🏿🎓", + ":man_student_tone4:": "👨🏾🎓", + ":man_student_medium_dark_skin_tone:": "👨🏾🎓", + ":man_student_tone3:": "👨🏽🎓", + ":man_student_medium_skin_tone:": "👨🏽🎓", + ":man_student_tone2:": "👨🏼🎓", + ":man_student_medium_light_skin_tone:": "👨🏼🎓", + ":man_student_tone1:": "👨🏻🎓", + ":man_student_light_skin_tone:": "👨🏻🎓", + ":man_student:": "👨🎓", + ":woman_student_tone5:": "👩🏿🎓", + ":woman_student_dark_skin_tone:": "👩🏿🎓", + ":woman_student_tone4:": "👩🏾🎓", + ":woman_student_medium_dark_skin_tone:": "👩🏾🎓", + ":woman_student_tone3:": "👩🏽🎓", + ":woman_student_medium_skin_tone:": "👩🏽🎓", + ":woman_student_tone2:": "👩🏼🎓", + ":woman_student_medium_light_skin_tone:": "👩🏼🎓", + ":woman_student_tone1:": "👩🏻🎓", + ":woman_student_light_skin_tone:": "👩🏻🎓", + ":woman_student:": "👩🎓", + ":man_singer_tone5:": "👨🏿🎤", + ":man_singer_dark_skin_tone:": "👨🏿🎤", + ":man_singer_tone4:": "👨🏾🎤", + ":man_singer_medium_dark_skin_tone:": "👨🏾🎤", + ":man_singer_tone3:": "👨🏽🎤", + ":man_singer_medium_skin_tone:": "👨🏽🎤", + ":man_singer_tone2:": "👨🏼🎤", + ":man_singer_medium_light_skin_tone:": "👨🏼🎤", + ":man_singer_tone1:": "👨🏻🎤", + ":man_singer_light_skin_tone:": "👨🏻🎤", + ":man_singer:": "👨🎤", + ":woman_singer_tone5:": "👩🏿🎤", + ":woman_singer_dark_skin_tone:": "👩🏿🎤", + ":woman_singer_tone4:": "👩🏾🎤", + ":woman_singer_medium_dark_skin_tone:": "👩🏾🎤", + ":woman_singer_tone3:": "👩🏽🎤", + ":woman_singer_medium_skin_tone:": "👩🏽🎤", + ":woman_singer_tone2:": "👩🏼🎤", + ":woman_singer_medium_light_skin_tone:": "👩🏼🎤", + ":woman_singer_tone1:": "👩🏻🎤", + ":woman_singer_light_skin_tone:": "👩🏻🎤", + ":woman_singer:": "👩🎤", + ":man_scientist_tone5:": "👨🏿🔬", + ":man_scientist_dark_skin_tone:": "👨🏿🔬", + ":man_scientist_tone4:": "👨🏾🔬", + ":man_scientist_medium_dark_skin_tone:": "👨🏾🔬", + ":man_scientist_tone3:": "👨🏽🔬", + ":man_scientist_medium_skin_tone:": "👨🏽🔬", + ":man_scientist_tone2:": "👨🏼🔬", + ":man_scientist_medium_light_skin_tone:": "👨🏼🔬", + ":man_scientist_tone1:": "👨🏻🔬", + ":man_scientist_light_skin_tone:": "👨🏻🔬", + ":man_scientist:": "👨🔬", + ":woman_scientist_tone5:": "👩🏿🔬", + ":woman_scientist_dark_skin_tone:": "👩🏿🔬", + ":woman_scientist_tone4:": "👩🏾🔬", + ":woman_scientist_medium_dark_skin_tone:": "👩🏾🔬", + ":woman_scientist_tone3:": "👩🏽🔬", + ":woman_scientist_medium_skin_tone:": "👩🏽🔬", + ":woman_scientist_tone2:": "👩🏼🔬", + ":woman_scientist_medium_light_skin_tone:": "👩🏼🔬", + ":woman_scientist_tone1:": "👩🏻🔬", + ":woman_scientist_light_skin_tone:": "👩🏻🔬", + ":woman_scientist:": "👩🔬", + ":man_office_worker_tone5:": "👨🏿💼", + ":man_office_worker_dark_skin_tone:": "👨🏿💼", + ":man_office_worker_tone4:": "👨🏾💼", + ":man_office_worker_medium_dark_skin_tone:": "👨🏾💼", + ":man_office_worker_tone3:": "👨🏽💼", + ":man_office_worker_medium_skin_tone:": "👨🏽💼", + ":man_office_worker_tone2:": "👨🏼💼", + ":man_office_worker_medium_light_skin_tone:": "👨🏼💼", + ":man_office_worker_tone1:": "👨🏻💼", + ":man_office_worker_light_skin_tone:": "👨🏻💼", + ":man_office_worker:": "👨💼", + ":woman_office_worker_tone5:": "👩🏿💼", + ":woman_office_worker_dark_skin_tone:": "👩🏿💼", + ":woman_office_worker_tone4:": "👩🏾💼", + ":woman_office_worker_medium_dark_skin_tone:": "👩🏾💼", + ":woman_office_worker_tone3:": "👩🏽💼", + ":woman_office_worker_medium_skin_tone:": "👩🏽💼", + ":woman_office_worker_tone2:": "👩🏼💼", + ":woman_office_worker_medium_light_skin_tone:": "👩🏼💼", + ":woman_office_worker_tone1:": "👩🏻💼", + ":woman_office_worker_light_skin_tone:": "👩🏻💼", + ":woman_office_worker:": "👩💼", + ":man_mechanic_tone5:": "👨🏿🔧", + ":man_mechanic_dark_skin_tone:": "👨🏿🔧", + ":man_mechanic_tone4:": "👨🏾🔧", + ":man_mechanic_medium_dark_skin_tone:": "👨🏾🔧", + ":man_mechanic_tone3:": "👨🏽🔧", + ":man_mechanic_medium_skin_tone:": "👨🏽🔧", + ":man_mechanic_tone2:": "👨🏼🔧", + ":man_mechanic_medium_light_skin_tone:": "👨🏼🔧", + ":man_mechanic_tone1:": "👨🏻🔧", + ":man_mechanic_light_skin_tone:": "👨🏻🔧", + ":man_mechanic:": "👨🔧", + ":woman_mechanic_tone5:": "👩🏿🔧", + ":woman_mechanic_dark_skin_tone:": "👩🏿🔧", + ":woman_mechanic_tone4:": "👩🏾🔧", + ":woman_mechanic_medium_dark_skin_tone:": "👩🏾🔧", + ":woman_mechanic_tone3:": "👩🏽🔧", + ":woman_mechanic_medium_skin_tone:": "👩🏽🔧", + ":woman_mechanic_tone2:": "👩🏼🔧", + ":woman_mechanic_medium_light_skin_tone:": "👩🏼🔧", + ":woman_mechanic_tone1:": "👩🏻🔧", + ":woman_mechanic_light_skin_tone:": "👩🏻🔧", + ":woman_mechanic:": "👩🔧", + ":man_health_worker_tone5:": "👨🏿⚕", + ":man_health_worker_dark_skin_tone:": "👨🏿⚕", + ":man_health_worker_tone4:": "👨🏾⚕", + ":man_health_worker_medium_dark_skin_tone:": "👨🏾⚕", + ":man_health_worker_tone3:": "👨🏽⚕", + ":man_health_worker_medium_skin_tone:": "👨🏽⚕", + ":man_health_worker_tone2:": "👨🏼⚕", + ":man_health_worker_medium_light_skin_tone:": "👨🏼⚕", + ":man_health_worker_tone1:": "👨🏻⚕", + ":man_health_worker_light_skin_tone:": "👨🏻⚕", + ":man_health_worker:": "👨⚕", + ":woman_health_worker_tone5:": "👩🏿⚕", + ":woman_health_worker_dark_skin_tone:": "👩🏿⚕", + ":woman_health_worker_tone4:": "👩🏾⚕", + ":woman_health_worker_medium_dark_skin_tone:": "👩🏾⚕", + ":woman_health_worker_tone3:": "👩🏽⚕", + ":woman_health_worker_medium_skin_tone:": "👩🏽⚕", + ":woman_health_worker_tone2:": "👩🏼⚕", + ":woman_health_worker_medium_light_skin_tone:": "👩🏼⚕", + ":woman_health_worker_tone1:": "👩🏻⚕", + ":woman_health_worker_light_skin_tone:": "👩🏻⚕", + ":woman_health_worker:": "👩⚕", + ":man_factory_worker_tone5:": "👨🏿🏭", + ":man_factory_worker_dark_skin_tone:": "👨🏿🏭", + ":man_factory_worker_tone4:": "👨🏾🏭", + ":man_factory_worker_medium_dark_skin_tone:": "👨🏾🏭", + ":man_factory_worker_tone3:": "👨🏽🏭", + ":man_factory_worker_medium_skin_tone:": "👨🏽🏭", + ":man_factory_worker_tone2:": "👨🏼🏭", + ":man_factory_worker_medium_light_skin_tone:": "👨🏼🏭", + ":man_factory_worker_tone1:": "👨🏻🏭", + ":man_factory_worker_light_skin_tone:": "👨🏻🏭", + ":man_factory_worker:": "👨🏭", + ":woman_factory_worker_tone5:": "👩🏿🏭", + ":woman_factory_worker_dark_skin_tone:": "👩🏿🏭", + ":woman_factory_worker_tone4:": "👩🏾🏭", + ":woman_factory_worker_medium_dark_skin_tone:": "👩🏾🏭", + ":woman_factory_worker_tone3:": "👩🏽🏭", + ":woman_factory_worker_medium_skin_tone:": "👩🏽🏭", + ":woman_factory_worker_tone2:": "👩🏼🏭", + ":woman_factory_worker_medium_light_skin_tone:": "👩🏼🏭", + ":woman_factory_worker_tone1:": "👩🏻🏭", + ":woman_factory_worker_light_skin_tone:": "👩🏻🏭", + ":woman_factory_worker:": "👩🏭", + ":man_cook_tone5:": "👨🏿🍳", + ":man_cook_dark_skin_tone:": "👨🏿🍳", + ":man_cook_tone4:": "👨🏾🍳", + ":man_cook_medium_dark_skin_tone:": "👨🏾🍳", + ":man_cook_tone3:": "👨🏽🍳", + ":man_cook_medium_skin_tone:": "👨🏽🍳", + ":man_cook_tone2:": "👨🏼🍳", + ":man_cook_medium_light_skin_tone:": "👨🏼🍳", + ":man_cook_tone1:": "👨🏻🍳", + ":man_cook_light_skin_tone:": "👨🏻🍳", + ":man_cook:": "👨🍳", + ":woman_cook_tone5:": "👩🏿🍳", + ":woman_cook_dark_skin_tone:": "👩🏿🍳", + ":woman_cook_tone4:": "👩🏾🍳", + ":woman_cook_medium_dark_skin_tone:": "👩🏾🍳", + ":woman_cook_tone3:": "👩🏽🍳", + ":woman_cook_medium_skin_tone:": "👩🏽🍳", + ":woman_cook_tone2:": "👩🏼🍳", + ":woman_cook_medium_light_skin_tone:": "👩🏼🍳", + ":woman_cook_tone1:": "👩🏻🍳", + ":woman_cook_light_skin_tone:": "👩🏻🍳", + ":woman_cook:": "👩🍳", + ":man_farmer_tone5:": "👨🏿🌾", + ":man_farmer_dark_skin_tone:": "👨🏿🌾", + ":man_farmer_tone4:": "👨🏾🌾", + ":man_farmer_medium_dark_skin_tone:": "👨🏾🌾", + ":man_farmer_tone3:": "👨🏽🌾", + ":man_farmer_medium_skin_tone:": "👨🏽🌾", + ":man_farmer_tone2:": "👨🏼🌾", + ":man_farmer_medium_light_skin_tone:": "👨🏼🌾", + ":man_farmer_tone1:": "👨🏻🌾", + ":man_farmer_light_skin_tone:": "👨🏻🌾", + ":man_farmer:": "👨🌾", + ":woman_farmer_tone5:": "👩🏿🌾", + ":woman_farmer_dark_skin_tone:": "👩🏿🌾", + ":woman_farmer_tone4:": "👩🏾🌾", + ":woman_farmer_medium_dark_skin_tone:": "👩🏾🌾", + ":woman_farmer_tone3:": "👩🏽🌾", + ":woman_farmer_medium_skin_tone:": "👩🏽🌾", + ":woman_farmer_tone2:": "👩🏼🌾", + ":woman_farmer_medium_light_skin_tone:": "👩🏼🌾", + ":woman_farmer_tone1:": "👩🏻🌾", + ":woman_farmer_light_skin_tone:": "👩🏻🌾", + ":woman_farmer:": "👩🌾", + ":man_in_business_suit_levitating_tone1:": "🕴🏻", + ":man_in_business_suit_levitating_light_skin_tone:": "🕴🏻", + ":man_in_business_suit_levitating_tone2:": "🕴🏼", + ":man_in_business_suit_levitating_medium_light_skin_tone:": "🕴🏼", + ":man_in_business_suit_levitating_tone3:": "🕴🏽", + ":man_in_business_suit_levitating_medium_skin_tone:": "🕴🏽", + ":man_in_business_suit_levitating_tone4:": "🕴🏾", + ":man_in_business_suit_levitating_medium_dark_skin_tone:": "🕴🏾", + ":man_in_business_suit_levitating_tone5:": "🕴🏿", + ":man_in_business_suit_levitating_dark_skin_tone:": "🕴🏿", + ":person_in_bed_tone1:": "🛌🏻", + ":person_in_bed_light_skin_tone:": "🛌🏻", + ":person_in_bed_tone2:": "🛌🏼", + ":person_in_bed_medium_light_skin_tone:": "🛌🏼", + ":person_in_bed_tone3:": "🛌🏽", + ":person_in_bed_medium_skin_tone:": "🛌🏽", + ":person_in_bed_tone4:": "🛌🏾", + ":person_in_bed_medium_dark_skin_tone:": "🛌🏾", + ":person_in_bed_tone5:": "🛌🏿", + ":person_in_bed_dark_skin_tone:": "🛌🏿", + ":family_man_boy:": "👨👦", + ":family_man_boy_boy:": "👨👦👦", + ":family_man_girl:": "👨👧", + ":family_man_girl_boy:": "👨👧👦", + ":family_woman_boy:": "👩👦", + ":family_woman_boy_boy:": "👩👦👦", + ":family_woman_girl:": "👩👧", + ":family_woman_girl_boy:": "👩👧👦", + ":family_woman_girl_girl:": "👩👧👧", + ":man_judge:": "👨⚖", + ":man_judge_tone1:": "👨🏻⚖", + ":man_judge_light_skin_tone:": "👨🏻⚖", + ":man_judge_tone2:": "👨🏼⚖", + ":man_judge_medium_light_skin_tone:": "👨🏼⚖", + ":man_judge_tone3:": "👨🏽⚖", + ":man_judge_medium_skin_tone:": "👨🏽⚖", + ":man_judge_tone4:": "👨🏾⚖", + ":man_judge_medium_dark_skin_tone:": "👨🏾⚖", + ":man_judge_tone5:": "👨🏿⚖", + ":man_judge_dark_skin_tone:": "👨🏿⚖", + ":woman_judge:": "👩⚖", + ":woman_judge_tone1:": "👩🏻⚖", + ":woman_judge_light_skin_tone:": "👩🏻⚖", + ":woman_judge_tone2:": "👩🏼⚖", + ":woman_judge_medium_light_skin_tone:": "👩🏼⚖", + ":woman_judge_tone3:": "👩🏽⚖", + ":woman_judge_medium_skin_tone:": "👩🏽⚖", + ":woman_judge_tone4:": "👩🏾⚖", + ":woman_judge_medium_dark_skin_tone:": "👩🏾⚖", + ":woman_judge_tone5:": "👩🏿⚖", + ":woman_judge_dark_skin_tone:": "👩🏿⚖", + ":man_pilot:": "👨✈", + ":man_pilot_tone1:": "👨🏻✈", + ":man_pilot_light_skin_tone:": "👨🏻✈", + ":man_pilot_tone2:": "👨🏼✈", + ":man_pilot_medium_light_skin_tone:": "👨🏼✈", + ":man_pilot_tone3:": "👨🏽✈", + ":man_pilot_medium_skin_tone:": "👨🏽✈", + ":man_pilot_tone4:": "👨🏾✈", + ":man_pilot_medium_dark_skin_tone:": "👨🏾✈", + ":man_pilot_tone5:": "👨🏿✈", + ":man_pilot_dark_skin_tone:": "👨🏿✈", + ":woman_pilot:": "👩✈", + ":woman_pilot_tone1:": "👩🏻✈", + ":woman_pilot_light_skin_tone:": "👩🏻✈", + ":woman_pilot_tone2:": "👩🏼✈", + ":woman_pilot_medium_light_skin_tone:": "👩🏼✈", + ":woman_pilot_tone3:": "👩🏽✈", + ":woman_pilot_medium_skin_tone:": "👩🏽✈", + ":woman_pilot_tone4:": "👩🏾✈", + ":woman_pilot_medium_dark_skin_tone:": "👩🏾✈", + ":woman_pilot_tone5:": "👩🏿✈", + ":woman_pilot_dark_skin_tone:": "👩🏿✈", + ":man_artist:": "👨🎨", + ":man_artist_tone1:": "👨🏻🎨", + ":man_artist_light_skin_tone:": "👨🏻🎨", + ":man_artist_tone2:": "👨🏼🎨", + ":man_artist_medium_light_skin_tone:": "👨🏼🎨", + ":man_artist_tone3:": "👨🏽🎨", + ":man_artist_medium_skin_tone:": "👨🏽🎨", + ":man_artist_tone4:": "👨🏾🎨", + ":man_artist_medium_dark_skin_tone:": "👨🏾🎨", + ":man_artist_tone5:": "👨🏿🎨", + ":man_artist_dark_skin_tone:": "👨🏿🎨", + ":woman_artist:": "👩🎨", + ":woman_artist_tone1:": "👩🏻🎨", + ":woman_artist_light_skin_tone:": "👩🏻🎨", + ":woman_artist_tone2:": "👩🏼🎨", + ":woman_artist_medium_light_skin_tone:": "👩🏼🎨", + ":woman_artist_tone3:": "👩🏽🎨", + ":woman_artist_medium_skin_tone:": "👩🏽🎨", + ":woman_artist_tone4:": "👩🏾🎨", + ":woman_artist_medium_dark_skin_tone:": "👩🏾🎨", + ":woman_artist_tone5:": "👩🏿🎨", + ":woman_artist_dark_skin_tone:": "👩🏿🎨", + ":man_astronaut:": "👨🚀", + ":man_astronaut_tone1:": "👨🏻🚀", + ":man_astronaut_light_skin_tone:": "👨🏻🚀", + ":man_astronaut_tone2:": "👨🏼🚀", + ":man_astronaut_medium_light_skin_tone:": "👨🏼🚀", + ":man_astronaut_tone3:": "👨🏽🚀", + ":man_astronaut_medium_skin_tone:": "👨🏽🚀", + ":man_astronaut_tone4:": "👨🏾🚀", + ":man_astronaut_medium_dark_skin_tone:": "👨🏾🚀", + ":man_astronaut_tone5:": "👨🏿🚀", + ":man_astronaut_dark_skin_tone:": "👨🏿🚀", + ":woman_astronaut:": "👩🚀", + ":woman_astronaut_tone1:": "👩🏻🚀", + ":woman_astronaut_light_skin_tone:": "👩🏻🚀", + ":woman_astronaut_tone2:": "👩🏼🚀", + ":woman_astronaut_medium_light_skin_tone:": "👩🏼🚀", + ":woman_astronaut_tone3:": "👩🏽🚀", + ":woman_astronaut_medium_skin_tone:": "👩🏽🚀", + ":woman_astronaut_tone4:": "👩🏾🚀", + ":woman_astronaut_medium_dark_skin_tone:": "👩🏾🚀", + ":woman_astronaut_tone5:": "👩🏿🚀", + ":woman_astronaut_dark_skin_tone:": "👩🏿🚀", + ":man_firefighter:": "👨🚒", + ":man_firefighter_tone1:": "👨🏻🚒", + ":man_firefighter_light_skin_tone:": "👨🏻🚒", + ":man_firefighter_tone2:": "👨🏼🚒", + ":man_firefighter_medium_light_skin_tone:": "👨🏼🚒", + ":man_firefighter_tone3:": "👨🏽🚒", + ":man_firefighter_medium_skin_tone:": "👨🏽🚒", + ":man_firefighter_tone4:": "👨🏾🚒", + ":man_firefighter_medium_dark_skin_tone:": "👨🏾🚒", + ":man_firefighter_tone5:": "👨🏿🚒", + ":man_firefighter_dark_skin_tone:": "👨🏿🚒", + ":woman_firefighter:": "👩🚒", + ":woman_firefighter_tone1:": "👩🏻🚒", + ":woman_firefighter_light_skin_tone:": "👩🏻🚒", + ":woman_firefighter_tone2:": "👩🏼🚒", + ":woman_firefighter_medium_light_skin_tone:": "👩🏼🚒", + ":woman_firefighter_tone3:": "👩🏽🚒", + ":woman_firefighter_medium_skin_tone:": "👩🏽🚒", + ":woman_firefighter_tone4:": "👩🏾🚒", + ":woman_firefighter_medium_dark_skin_tone:": "👩🏾🚒", + ":woman_firefighter_tone5:": "👩🏿🚒", + ":woman_firefighter_dark_skin_tone:": "👩🏿🚒", + ":female_sign:": "♀", + ":male_sign:": "♂", + ":medical_symbol:": "⚕", + ":united_nations:": "🇺🇳", + ":snowboarder_tone2:": "🏂🏼", + ":snowboarder_medium_light_skin_tone:": "🏂🏼", + ":snowboarder_tone3:": "🏂🏽", + ":snowboarder_medium_skin_tone:": "🏂🏽", + ":snowboarder_tone4:": "🏂🏾", + ":snowboarder_medium_dark_skin_tone:": "🏂🏾", + ":snowboarder_tone5:": "🏂🏿", + ":snowboarder_dark_skin_tone:": "🏂🏿", + ":person_golfing_tone1:": "🏌🏻", + ":person_golfing_light_skin_tone:": "🏌🏻", + ":person_golfing_tone2:": "🏌🏼", + ":person_golfing_medium_light_skin_tone:": "🏌🏼", + ":person_golfing_tone3:": "🏌🏽", +} + +function replace_emoji() { + $('.emoji_poss').each(function(){ + const emoji = $(this).html().match(/(:.+?:)|✅/g); + for(let i in emoji) { + if(emoji_dict[emoji[i]]) { + $(this).html($(this).html().replace(emoji[i], emoji_dict[emoji[i]])); + $(this).removeClass('emoji_poss'); + } + } + $(this).html($(this).html().replace("✅", "")); + }); + twemoji.parse(document.body); +}; + +function replaced_emoji_return(original) { + const emoji = original.match(/(:.+?:)/g); + for(let i in emoji) { + if(emoji_dict[emoji[i]]) { + original = original.replace(emoji[i], emoji_dict[emoji[i]]); + } + } + return original +}; diff --git a/public_html/assets/js/shortcut.js b/public_html/assets/js/shortcut.js new file mode 100644 index 0000000..387b00c --- /dev/null +++ b/public_html/assets/js/shortcut.js @@ -0,0 +1,223 @@ +/** + * http://www.openjs.com/scripts/events/keyboard_shortcuts/ + * Version : 2.01.B + * By Binny V A + * License : BSD + */ +shortcut = { + 'all_shortcuts':{},//All the shortcuts are stored in this array + 'add': function(shortcut_combination,callback,opt) { + //Provide a set of default options + var default_options = { + 'type':'keydown', + 'propagate':false, + 'disable_in_input':false, + 'target':document, + 'keycode':false + } + if(!opt) opt = default_options; + else { + for(var dfo in default_options) { + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; + } + } + + var ele = opt.target; + if(typeof opt.target == 'string') ele = document.getElementById(opt.target); + var ths = this; + shortcut_combination = shortcut_combination.toLowerCase(); + + //The function to be called at keypress + var func = function(e) { + e = e || window.event; + + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields + var element; + if(e.target) element=e.target; + else if(e.srcElement) element=e.srcElement; + if(element.nodeType==3) element=element.parentNode; + + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; + } + + //Find Which key is pressed + if (e.keyCode) code = e.keyCode; + else if (e.which) code = e.which; + var character = String.fromCharCode(code).toLowerCase(); + + if(code == 188) character=","; //If the user presses , when the type is onkeydown + if(code == 190) character="."; //If the user presses , when the type is onkeydown + + var keys = shortcut_combination.split("+"); + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked + var kp = 0; + + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken + var shift_nums = { + "`":"~", + "1":"!", + "2":"@", + "3":"#", + "4":"$", + "5":"%", + "6":"^", + "7":"&", + "8":"*", + "9":"(", + "0":")", + "-":"_", + "=":"+", + ";":":", + "'":"\"", + ",":"<", + ".":">", + "/":"?", + "\\":"|" + } + //Special Keys - and their codes + var special_keys = { + 'esc':27, + 'escape':27, + 'tab':9, + 'space':32, + 'return':13, + 'enter':13, + 'backspace':8, + + 'scrolllock':145, + 'scroll_lock':145, + 'scroll':145, + 'capslock':20, + 'caps_lock':20, + 'caps':20, + 'numlock':144, + 'num_lock':144, + 'num':144, + + 'pause':19, + 'break':19, + + 'insert':45, + 'home':36, + 'delete':46, + 'end':35, + + 'pageup':33, + 'page_up':33, + 'pu':33, + + 'pagedown':34, + 'page_down':34, + 'pd':34, + + 'left':37, + 'up':38, + 'right':39, + 'down':40, + + 'f1':112, + 'f2':113, + 'f3':114, + 'f4':115, + 'f5':116, + 'f6':117, + 'f7':118, + 'f8':119, + 'f9':120, + 'f10':121, + 'f11':122, + 'f12':123 + } + + var modifiers = { + shift: { wanted:false, pressed:false}, + ctrl : { wanted:false, pressed:false}, + alt : { wanted:false, pressed:false}, + meta : { wanted:false, pressed:false} //Meta is Mac specific + }; + + if(e.ctrlKey) modifiers.ctrl.pressed = true; + if(e.shiftKey) modifiers.shift.pressed = true; + if(e.altKey) modifiers.alt.pressed = true; + if(e.metaKey) modifiers.meta.pressed = true; + + for(var i=0; k=keys[i],i 1) { //If it is a special key + if(special_keys[k] == code) kp++; + + } else if(opt['keycode']) { + if(opt['keycode'] == code) kp++; + + } else { //The special keys did not match + if(character == k) kp++; + else { + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase + character = shift_nums[character]; + if(character == k) kp++; + } + } + } + } + + if(kp == keys.length && + modifiers.ctrl.pressed == modifiers.ctrl.wanted && + modifiers.shift.pressed == modifiers.shift.wanted && + modifiers.alt.pressed == modifiers.alt.wanted && + modifiers.meta.pressed == modifiers.meta.wanted) { + callback(e); + + if(!opt['propagate']) { //Stop the event + //e.cancelBubble is supported by IE - this will kill the bubbling process. + e.cancelBubble = true; + e.returnValue = false; + + //e.stopPropagation works in Firefox. + if (e.stopPropagation) { + e.stopPropagation(); + e.preventDefault(); + } + return false; + } + } + } + this.all_shortcuts[shortcut_combination] = { + 'callback':func, + 'target':ele, + 'event': opt['type'] + }; + //Attach the function with the event + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); + else ele['on'+opt['type']] = func; + }, + + //Remove the shortcut - just specify the shortcut and I will remove the binding + 'remove':function(shortcut_combination) { + shortcut_combination = shortcut_combination.toLowerCase(); + var binding = this.all_shortcuts[shortcut_combination]; + delete(this.all_shortcuts[shortcut_combination]) + if(!binding) return; + var type = binding['event']; + var ele = binding['target']; + var callback = binding['callback']; + + if(ele.detachEvent) ele.detachEvent('on'+type, callback); + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); + else ele['on'+type] = false; + } + +} \ No newline at end of file diff --git a/public_html/federated.php b/public_html/federated.php new file mode 100644 index 0000000..ee94a37 --- /dev/null +++ b/public_html/federated.php @@ -0,0 +1,66 @@ + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + +
    + +
      +
    + +
    + +
    + +
    + + + +
    + +
    + + + \ No newline at end of file diff --git a/public_html/footer.php b/public_html/footer.php new file mode 100644 index 0000000..e1bb889 --- /dev/null +++ b/public_html/footer.php @@ -0,0 +1,76 @@ + + +
    + +
    + + + +
    +
    + +
    + +
    + +
    + + + +
    + + + +
    +
    + + + + + + + \ No newline at end of file diff --git a/public_html/header.php b/public_html/header.php new file mode 100644 index 0000000..36798e9 --- /dev/null +++ b/public_html/header.php @@ -0,0 +1,160 @@ + + + + + + + + + Halcyon + + + + + + + + + + + + + + + + + + + + + diff --git a/public_html/home.php b/public_html/home.php new file mode 100644 index 0000000..7448f91 --- /dev/null +++ b/public_html/home.php @@ -0,0 +1,62 @@ + + + +
    + +
    + + + +
    + +
    + +
    + +
    + +
    + +
      +
    + +
    + +
    + +
    + + + +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/index.php b/public_html/index.php new file mode 100644 index 0000000..68ac7ec --- /dev/null +++ b/public_html/index.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public_html/local.php b/public_html/local.php new file mode 100644 index 0000000..74f2d5c --- /dev/null +++ b/public_html/local.php @@ -0,0 +1,76 @@ + + + +
    + +
    + + + +
    + +
    + + + +
    + +
    + +
    + +
      +
    + +
    + +
    + +
    + + + +
    + +
    + + + \ No newline at end of file diff --git a/public_html/login/assets/css/style.css b/public_html/login/assets/css/style.css new file mode 100644 index 0000000..af0588c --- /dev/null +++ b/public_html/login/assets/css/style.css @@ -0,0 +1,571 @@ +@charset "utf-8"; + +/*-------------------------------------- + Reset +--------------------------------------*/ + +* { + margin: 0; + padding: 0; + font-size: 100%; +} + +a { + text-decoration: none; + word-break: break-all; + color: inherit; +} + +a:hover { + text-decoration: underline; +} + +ul, ol { + list-style: none; + padding: 0; + margin: 0; +} + +img { + vertical-align: top; + border: 0; + max-width: 100%; + max-height: 100%; +} + +button { + font-size: 100%; +} + +.clear { + clear: both; +} + +.red { + color: red!important; +} + +.invisible { + display: none!important; +} + +.no-events { + pointer-events: none!important; +} + +.no-underline, +.no-underline:hover { + text-decoration: none!important; +} + +.disallow_select { + user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + -moz-user-select: none; +} + +.text_ellipsis { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; +} + +.pointer { + cursor: pointer; +} + +.khmer_font { + font-family: "Khmer MN", Helvetica, Arial, sans-serif!important; +} + +.gill_font { + font-family: "Gill Sans", Helvetica, Arial, sans-serif!important; +} + +.trebuchet_font { + font-family: "Trebuchet MS", Helvetica, Arial, sans-serif!important; +} + +h1, h2, h3, h4, h5, h6 { + font-weight: normal; + line-height: 1; + margin: 0; + padding: 0; +} + +blockquote, q { + quotes: none; + margin: 0; +} + +blockquote * { + margin: 0; + word-break: break-all; +} + +blockquote:before, blockquote:after, +q:before, q:after { + content:''; + content:none; +} + +article,aside,details,figcaption,figure, +footer,header,hgroup,menu,nav,section { + display:block; +} + +textarea { + width: 100%; +} + +input { + max-width: 100%; +} + +button, +input[type="submit"], +input[type="button"], +input[type="text"], +input[type="password"], +textarea, +select{ + background-color: transparent; + border: none; + cursor: pointer; + outline: none; + padding: 0; + appearance: none; +} +input:-webkit-autofill { + -webkit-box-shadow: 0 0 0px 1000px transparent inset; +} + +/* Twitter Emoji Prefix */ +img.emoji { + height: 1em; + width: 1em; + margin: 0 .05em 0 .1em; + vertical-align: -0.1em; +} + +/*-------------------------------------- + Base +--------------------------------------*/ + +html { + font-family : "Trebuchet MS",Helvetica,"ヒラギノ角ゴ Pro W3", + "Hiragino Kaku Gothic Pro",Meiryo,"メイリオ","MS Pゴシック",Arial,sans-serif; + font-size : 100%; + line-height : 1; + color: #333; + min-width: 100%; + min-height: 100%; +} + +body { + margin: 0; + padding: 0; + min-width: 100%; + min-height: 100%; + word-wrap:break-word; + background-color: #F5F8FA; +} + +/*------------------------------------- + HEADER AREA +-------------------------------------*/ + +#header { + width: 100%; + height: 56px; + color: #fff; + background-color: #222; + box-shadow: 0px 3px 5px rgba(0,0,0,0.26); + position: fixed; + z-index: 999; +} + +#header #header_wrap { + display: flex; + justify-content: flex-start; + align-items: center; + width: 100%; + height: 100%; +} + +#header #header_wrap > .header_box { + height: 100%; + flex-grow: 1; + flex-shrink: 0; +} + +/*------------------------------------- + HEADER AREA: TITLE +-------------------------------------*/ + +#header #header_wrap .header_box.header_right_box { + display: flex; + justify-content: flex-start; +} + +#header #header_wrap .header_box.header_right_box .title_box { + height: 100%; + margin-left: 24px; + box-sizing: border-box; +} + +/*------------------------------------- + HEADER AREA: NAV +-------------------------------------*/ + +#header #header_wrap .header_box.header_left_box { + display: flex; + justify-content: flex-end; +} + +#header #header_wrap .header_box.header_left_box nav { + height: 100%; +} + +#header #header_wrap .header_box.header_left_box .nav_box ul { + display: block; + height: 100%; + width: 100%; +} + +#header #header_wrap .header_box.header_left_box .nav_box ul a { + height: 100%; +} + +#header #header_wrap .header_box.header_left_box .nav_box ul li { + display: block; + float: left; + cursor: pointer; + height: calc(100% - 5px*2 ); + margin-top: 5px; + border-bottom: 0px solid #007BD0; +} + +#header #header_wrap .header_box.header_left_box .nav_box ul li span { + display: block; + height: 100%; + margin: auto; + padding: 15px 24px; + font-size: 14px; + box-sizing: border-box; +} + +#header #header_wrap .header_box.header_left_box .nav_box ul li span i { + margin-right: 4px; +} + +#header #header_wrap .header_box.header_left_box .nav_box ul li:hover { + color: #189EFC; + border-bottom-width: 5px; + transition: 0.15s ease-out; +} + +/*------------------------------------- + MAIN +-------------------------------------*/ + +#main { + padding-top: 56px; +} + +/*------------------------------------- + FORM +-------------------------------------*/ + +#main #login_form_wrap { + width: 100%; + height: 560px; + padding: 56px 0; + margin-bottom: -200px; + box-sizing: border-box; + background-image: url("/login/assets/images/background.jpg"); + background-size: cover; + background-repeat: no-repeat; +} + +#main #login_form_wrap .login_form { + position: relative; + width: 640px; + height: 220px; + padding: 36px 24px; + margin: auto; + overflow: hidden; + background: inherit; + box-sizing: border-box; + border-radius: 4px; + border: 1px solid #C9EFF8; + text-align: center; + box-shadow: 0px 5px 5px rgba(0,0,0,0.26); + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form.expand { + width: 780px; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form::before { + display: block; + position: absolute; + content: ""; + top: -3px; + left: -3px; + right: -3px; + bottom: -3px; + background: inherit; + background-position: top center; + filter: blur(3px); + border-radius: 5px; + z-index: 0; +} + +#main #login_form_wrap .login_form form { + position: relative; + margin: auto; + z-index: 1; + color: #C9EFF8; +} + +#main #login_form_wrap .login_form form a { + color: #fff; +} + +#main #login_form_wrap .login_form h2 { + font-size: 32px; + font-weight: 600; + margin-bottom: 16px; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form.expand h2 { + font-size: 42px; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form p { + margin-bottom: 16px; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form.expand p { + opacity: 0; + margin-bottom: 0; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form .login_form_main { + display: flex; + flex-wrap: nowrap; + justify-content: flex-start; + align-items: center; + margin: auto; + height: 32px; + width: 276px; + border: 1px solid #C9EFF8; + border-radius: 32px; + background-color: rgba(0,0,0,.3); + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form.expand .login_form_main { + width: 360px; + height: 42px; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form .login_form_main.active { + box-shadow: 0px 3px 5px rgba(0,0,0,0.26); +} + +#main #login_form_wrap .login_form .login_form_main input[name="acct"] { + display: block; + -webkit-appearance : none; + flex-grow: 1; + padding: 4px 0 4px 14px; + color: #C9EFF8; + border: none; + background: none; + box-sizing: border-box; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form.expand .login_form_main input[name="acct"] { + flex-grow: 2; + padding: 8px 0 8px 14px; + transition: 0.25s ease-out; +} + +#main #login_form_wrap .login_form .login_form_main .login_form_continue { + display: block; + flex-grow: 1; + color: #C9EFF8; +} + +#main #login_form_wrap .login_form .login_form_main .login_form_continue:hover { + color: #fff; +} + +#main #login_form_wrap .login_form .login_form_agree { + margin: 16px auto 0; +} + +#main #login_form_wrap .login_form .login_form_agree i { + color: #fff; +} + +/*------------------------------------- + ARTICLE +-------------------------------------*/ + +#article { + position: relative; + width: 640px; + margin: auto; + margin-bottom: 56px; + padding: 24px 36px 36px; + border-radius: 4px; + background-color: #fff; + box-sizing: border-box; + box-shadow: 3px 3px 5px rgba(0,0,0,0.26); +} + +#article h2 { + font-size: 32px; + font-weight: 600; + margin: 16px 0; +} + +#article p { + display: inline-block; + margin-bottom: 16px; + font-size: 16px; + line-height: 1.2; +} + +#article .image_wrap { + display: block; + position: relative; + margin: 0 -36px 24px; + border-top: 0.5px solid #555; + border-bottom: 0.5px solid #555; +} + +#article .image_wrap ul { + display: block; + position: relative; + width: 100%; + height: 370px; + overflow: hidden; +} + +#article .image_wrap ul li { + position: absolute; + top: 0; + left: 0; +} + +@keyframes fadeout { + 0% {opacity: 1;} + 100% {opacity: 0;} +} + +@keyframes fadein { + 0% {opacity: 0;} + 100% {opacity: 1;} +} + +#article .image_wrap ul li.fadeout { + animation-name: fadeout; + animation-duration: 0.5s; + animation-fill-mode: forwards; +} + +#article .image_wrap ul li.fadein { + animation-name: fadein; + animation-duration: 0.5s; + animation-fill-mode: forwards; +} + +#article .image_wrap .switch_button { + display: block; + opacity: 0; + position: absolute; + top: 0; + width: 30px; + height: 100%; + color: #fff; + background-color: rgba(0, 0, 0, .3); + transition: 0.15s ease-out; +} + +#article .image_wrap:hover .switch_button { + opacity: 1; + transition: 0.15s ease-out; +} + +@keyframes switching_image_list { + 0% {background-color: rgba(0, 0, 0, .3);} + 50% {background-color: rgba(0, 0, 0, .8);} + 100% {background-color: rgba(0, 0, 0, .3);} +} + +#article .image_wrap:hover .switch_button.active { + animation-name: switching_image_list; + animation-duration: 0.35s; +} + +#article .image_wrap .switch_button.prev_button { + left: 0; +} + +#article .image_wrap .switch_button.next_button { + right: 0; +} + + +#article a { + color: #189EFC; +} + +/*------------------------------------- + FOOTER +-------------------------------------*/ + +#footer { + width: 640px; + padding: 24px 36px 12px; + box-sizing: border-box; + margin: auto; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + box-shadow: 3px 3px 5px rgba(0,0,0,0.26); + background-color: #222; +} + +#footer .footer_anchor { + display: flex; + justify-content: center; + align-items: center; + color: #444; + font-size: 36px; + transition: 0.15s ease-out; +} + +#footer .footer_anchor:hover { + color: #555; + transition: 0.15s ease-out; +} + +#footer span { + font-size: 14px; + color: #ddd; + margin: auto; + display: block; + text-align: center; +} \ No newline at end of file diff --git a/public_html/login/assets/images/background.jpg b/public_html/login/assets/images/background.jpg new file mode 100644 index 0000000..54309c6 Binary files /dev/null and b/public_html/login/assets/images/background.jpg differ diff --git a/public_html/login/assets/images/halcyon-title.png b/public_html/login/assets/images/halcyon-title.png new file mode 100644 index 0000000..c73c1db Binary files /dev/null and b/public_html/login/assets/images/halcyon-title.png differ diff --git a/public_html/login/assets/images/halcyon_logo.png b/public_html/login/assets/images/halcyon_logo.png new file mode 100644 index 0000000..4468cdf Binary files /dev/null and b/public_html/login/assets/images/halcyon_logo.png differ diff --git a/public_html/login/assets/images/preview0.png b/public_html/login/assets/images/preview0.png new file mode 100644 index 0000000..06e9a6b Binary files /dev/null and b/public_html/login/assets/images/preview0.png differ diff --git a/public_html/login/assets/images/preview1.png b/public_html/login/assets/images/preview1.png new file mode 100644 index 0000000..eed662b Binary files /dev/null and b/public_html/login/assets/images/preview1.png differ diff --git a/public_html/login/assets/images/preview2.png b/public_html/login/assets/images/preview2.png new file mode 100644 index 0000000..9f76cdf Binary files /dev/null and b/public_html/login/assets/images/preview2.png differ diff --git a/public_html/login/assets/js/halcyon_login.js b/public_html/login/assets/js/halcyon_login.js new file mode 100644 index 0000000..9722339 --- /dev/null +++ b/public_html/login/assets/js/halcyon_login.js @@ -0,0 +1,55 @@ +$(function() { + + $(document).on('change','.login_form_agree #agree', function(e) { + const icon = $(this).parent().find('i.fa'); + if ( $(this).prop('checked') ) { + icon.addClass("fa-check-square-o"); + icon.removeClass("fa-square-o"); + } else if ( !$(this).prop('checked') ) { + icon.addClass("fa-square-o"); + icon.removeClass("fa-check-square-o"); + } + }); + + $(document).on('focus', '#main #login_form_wrap .login_form .login_form_main input[name="acct"]', function(e) { + $(this).parent().addClass('active') + $(".login_form").addClass('expand'); + }) + + $(document).on('blur', '#main #login_form_wrap .login_form .login_form_main input[name="acct"]', function(e) { + $(this).parent().removeClass('active') + $(".login_form").removeClass('expand'); + }) + + $(document).on('mousedown', '.image_wrap .switch_button', function(e) { + const self = $(this); + self.addClass('active'); + setTimeout(function() { + self.removeClass('active'); + }, 500); + }) + + $(document).on('click', '.image_wrap .prev_button', function(e) { + + const firstChild = $(this).parent(".image_wrap").find('ul li:first-child'); + firstChild.appendTo(".image_wrap ul"); + firstChild.addClass('fadein'); + setTimeout(function() { + firstChild.removeClass('fadein'); + }, 500); + + }) + + $(document).on('click', '.image_wrap .next_button', function(e) { + + const lastChild = $(this).parent(".image_wrap").find('ul li:last-child');; + lastChild.addClass('fadeout'); + setTimeout(function() { + lastChild.prependTo(".image_wrap ul"); + lastChild.removeClass('fadeout'); + }, 500); + + }) + + +}) \ No newline at end of file diff --git a/public_html/login/auth.php b/public_html/login/auth.php new file mode 100644 index 0000000..f16acbc --- /dev/null +++ b/public_html/login/auth.php @@ -0,0 +1,70 @@ + + + + + + + + selectInstance($URL); + $response = $api->get_access_token($api->clientWebsite.'/auth?&host='.$domain, htmlspecialchars((string)filter_input(INPUT_GET, 'code'), ENT_QUOTES)); + + if ($response['html']["access_token"]) { + + $access_token = $response['html']["access_token"]; + $account_id = $api->accounts_verify_credentials()['html']['id']; + + echo " + + "; + + } + } + ?> + + + + + + + + diff --git a/public_html/login/login.php b/public_html/login/login.php new file mode 100644 index 0000000..5781f85 --- /dev/null +++ b/public_html/login/login.php @@ -0,0 +1,234 @@ + + + + + + + + + Halcyon for Mastodon + + + + + + + + + + clientWebsite.'/login?cause=domain', true, 303); + die(); + } else { + try { + $client_id = $api->getInstance($URL)["client_id"]; + $authorizeURL = $URL.'/oauth/authorize?client_id='.$client_id.'&response_type=code&scope=read+write+follow&website='.$api->clientWebsite.'&redirect_uri='.urlencode($api->clientWebsite.'/auth?&host='.$domain); + header("Location: {$authorizeURL}", true, 303); + die(); + } catch (Exception $e) { + header('Location: '.$api->clientWebsite.'/login?cause=domain', true, 303); + die(); + } + } + } + ?> + + + + + + + + +
    + +
    + + + +
    + +
    + +

    What is Halcyon

    + +

    + Halcyon is standard Twitter like client of Mastodon, And you can use it just by login to your instance. Let's Toot like a tweet. +

    + +
    + +
      +
    • halcyon_screenshot
    • +
    • halcyon_screenshot
    • +
    • halcyon_screenshot
    • +
    + + + + +
    + +

    Contact / Feedback

    + +

    + Mastodon: @nipos@social.wiuwiu.de
    + Email: Use my contact form
    + Github: /halcyon-suite +

    + +

    Help us

    + +

    + Bitcoin: 1D6GThQqHQYnruKYrKyW9JC86ZGWxjt1hK
    +

    + +
    + +
    + + + + + + + + + + + diff --git a/public_html/login/logout.php b/public_html/login/logout.php new file mode 100644 index 0000000..bb5475b --- /dev/null +++ b/public_html/login/logout.php @@ -0,0 +1,3 @@ + + + diff --git a/public_html/login/terms.php b/public_html/login/terms.php new file mode 100644 index 0000000..ae3f0f5 --- /dev/null +++ b/public_html/login/terms.php @@ -0,0 +1,128 @@ + + + + + + + + Halcyon for Mastodon + + + + + + + + + + + + +
    +
    +

    Halcyon Terms of Use

    +

    This terms of use agreement is for the users of web service Halcyon for Mastodon (Halcyon for short) hosted at halcyon.social.

    +
    +

    1. Agreement

    +

    By logging into Halcyon you agree to this terms of use agreement. Do not use this service if you do not agree to these terms.

    +
    +

    2. Change

    +

    We reserve the right to modify these terms of use at any time if deemed necessary.

    +
    +

    3. Account

    +

    Users can connect to various Mastodon accounts from Halcyon, and Halcyon will not interfere with those connection.

    +
    +

    4. Content

    +

    Halcyon does not own the right to or hold responsibility for any text, image, animation, audio content accessible from Halcyon. The right and responsibility belong to the owners of instances that host those content.

    +
    +

    5. Guideline

    +

    Halcyon reserves the right to terminate service for

    +
      +
    • actions violating the laws of countries
    • +
    • actions contrary to public order and standards of decency
    • +
    • violation of third party’s right to intellectual property, brand, privacy, etc.
    • +
    • acts of violence, sexual nature, of discrimination
    • +
    • phishing or spamming
    • +
    • actions causing problem to the network infrastructure of Halcyon
    • +
    +
    +

    6. Disclaimer

    +

    Halcyon is not responsible for any damage caused by using this service.

    +
    +

    Last updated 2017/5/12

    +
    + +
    + + + + diff --git a/public_html/notifications.php b/public_html/notifications.php new file mode 100644 index 0000000..6a399a4 --- /dev/null +++ b/public_html/notifications.php @@ -0,0 +1,69 @@ + + + +
    + +
    + + + +
    + +
    + +
    + +
    + +
    + +
      +
    + +
    + +
    + +
    + + + +
    + +
    + + + \ No newline at end of file diff --git a/public_html/search_hash_tag.php b/public_html/search_hash_tag.php new file mode 100644 index 0000000..fd9a575 --- /dev/null +++ b/public_html/search_hash_tag.php @@ -0,0 +1,80 @@ + + + +
    + + + +
    + + + +
    + +
    +
      + +
    • +
    • + +
    +
    + +
    + +
    + +
      +
    + +
    + +
    + +
    + + + +
    + +
    + + + \ No newline at end of file diff --git a/public_html/search_user.php b/public_html/search_user.php new file mode 100644 index 0000000..9d3c44d --- /dev/null +++ b/public_html/search_user.php @@ -0,0 +1,51 @@ + + + +
    + + + +
    + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/user.php b/public_html/user.php new file mode 100644 index 0000000..11626c7 --- /dev/null +++ b/public_html/user.php @@ -0,0 +1,158 @@ + + + +
    + + + +
    + + + + + + +
    +
    + + + + \ No newline at end of file diff --git a/public_html/user_favorite.php b/public_html/user_favorite.php new file mode 100644 index 0000000..79b35c7 --- /dev/null +++ b/public_html/user_favorite.php @@ -0,0 +1,147 @@ + + + +
    + + + +
    + + + +
    + +
    + +
    + +
    + +
    + +
      +
    + +
    + +
    + +
    + + + +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/user_followers.php b/public_html/user_followers.php new file mode 100644 index 0000000..034d46a --- /dev/null +++ b/public_html/user_followers.php @@ -0,0 +1,115 @@ + + + +
    + + + +
    + + + +
    + +
    + +
    + +
    + +
    + +
    +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/user_following.php b/public_html/user_following.php new file mode 100644 index 0000000..424da0e --- /dev/null +++ b/public_html/user_following.php @@ -0,0 +1,115 @@ + + + +
    + + + +
    + + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/user_include_replies.php b/public_html/user_include_replies.php new file mode 100644 index 0000000..47632f7 --- /dev/null +++ b/public_html/user_include_replies.php @@ -0,0 +1,159 @@ + + + +
    + + + +
    + + + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/user_only_media.php b/public_html/user_only_media.php new file mode 100644 index 0000000..d93d427 --- /dev/null +++ b/public_html/user_only_media.php @@ -0,0 +1,160 @@ + + + +
    + + + +
    + + + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/public_html/widgets/create_status.php b/public_html/widgets/create_status.php new file mode 100644 index 0000000..c8b9697 --- /dev/null +++ b/public_html/widgets/create_status.php @@ -0,0 +1,101 @@ +
    + +
    + +
    + +
    + + +
    + +
    + + +
    + + + + + +
    + +
    + + + +
    diff --git a/public_html/widgets/overlay_copy_link.php b/public_html/widgets/overlay_copy_link.php new file mode 100644 index 0000000..b7df9f7 --- /dev/null +++ b/public_html/widgets/overlay_copy_link.php @@ -0,0 +1,11 @@ + \ No newline at end of file diff --git a/public_html/widgets/overlay_create_status.php b/public_html/widgets/overlay_create_status.php new file mode 100644 index 0000000..167c2eb --- /dev/null +++ b/public_html/widgets/overlay_create_status.php @@ -0,0 +1,104 @@ + \ No newline at end of file diff --git a/public_html/widgets/overlay_message.php b/public_html/widgets/overlay_message.php new file mode 100644 index 0000000..3038d6b --- /dev/null +++ b/public_html/widgets/overlay_message.php @@ -0,0 +1,5 @@ +
    +
    + +
    +
    \ No newline at end of file diff --git a/public_html/widgets/overlay_single_reply.php b/public_html/widgets/overlay_single_reply.php new file mode 100644 index 0000000..d6ba786 --- /dev/null +++ b/public_html/widgets/overlay_single_reply.php @@ -0,0 +1,105 @@ + \ No newline at end of file diff --git a/public_html/widgets/search_header.php b/public_html/widgets/search_header.php new file mode 100644 index 0000000..522516f --- /dev/null +++ b/public_html/widgets/search_header.php @@ -0,0 +1,31 @@ +
    +

    +
    + + +
    +
    + + +
    + +
    + +
    +
    \ No newline at end of file diff --git a/public_html/widgets/side_change_local.php b/public_html/widgets/side_change_local.php new file mode 100644 index 0000000..abf07f2 --- /dev/null +++ b/public_html/widgets/side_change_local.php @@ -0,0 +1,15 @@ +
    + +
    +

    Change instance

    +
    + +
    + +
    + +
    + +
    + +
    diff --git a/public_html/widgets/side_current_user.php b/public_html/widgets/side_current_user.php new file mode 100644 index 0000000..09eb005 --- /dev/null +++ b/public_html/widgets/side_current_user.php @@ -0,0 +1,46 @@ +
    + +
    + +
    + +
    + +
    + +
    + + + + + +
    +
    \ No newline at end of file diff --git a/public_html/widgets/side_dev_team.php b/public_html/widgets/side_dev_team.php new file mode 100644 index 0000000..cd37c9a --- /dev/null +++ b/public_html/widgets/side_dev_team.php @@ -0,0 +1,61 @@ +
    + +

    Dev team

    + + +
    \ No newline at end of file diff --git a/public_html/widgets/side_footer.php b/public_html/widgets/side_footer.php new file mode 100644 index 0000000..6a5af48 --- /dev/null +++ b/public_html/widgets/side_footer.php @@ -0,0 +1,33 @@ + + + diff --git a/public_html/widgets/side_load_options.php b/public_html/widgets/side_load_options.php new file mode 100644 index 0000000..78551fc --- /dev/null +++ b/public_html/widgets/side_load_options.php @@ -0,0 +1,28 @@ +
    + +
    +

    Preferences

    + +
    + +
    + +

    New posts streaming

    +
    +
    + +

    Default post privacy

    +
    +
    + +

    Local instance

    +
    +
    + +

    Hashtag search filter

    +
    +
    + +
    + +
    diff --git a/public_html/widgets/side_who_to_follow.php b/public_html/widgets/side_who_to_follow.php new file mode 100644 index 0000000..beeafea --- /dev/null +++ b/public_html/widgets/side_who_to_follow.php @@ -0,0 +1,60 @@ +
    + +

    Who to follow

    + + +
    \ No newline at end of file diff --git a/public_html/widgets/user_header.php b/public_html/widgets/user_header.php new file mode 100644 index 0000000..85a784d --- /dev/null +++ b/public_html/widgets/user_header.php @@ -0,0 +1,54 @@ + +
    + +
    + + +
    +
    + + +
    + +
    + + +
    + +
    +
    +
    \ No newline at end of file diff --git a/public_html/widgets/user_recent_images.php b/public_html/widgets/user_recent_images.php new file mode 100644 index 0000000..4fa464f --- /dev/null +++ b/public_html/widgets/user_recent_images.php @@ -0,0 +1,9 @@ +
    + + + +
    + +
    + +
    \ No newline at end of file