diff --git a/.gitignore b/.gitignore deleted file mode 100755 index 1e4ca024..00000000 --- a/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -.DS_Store -Thumbs.db -db.json -*.log -node_modules/ -public/ -.deploy*/ -.history/ -package-lock.json -yarn.lock diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index b10ede21..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "themes/maupassant"] - path = themes/maupassant - url = https://github.com/hackdapp/maupassant-hexo.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100755 index ee504ade..00000000 --- a/.travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -language: node_js -node_js: - - "9" - -cache: - directories: - - node_modules - -#env: -# global: -# - GH_REF: github.com/thinklife/thinklife.github.io.git -before_install: - - openssl aes-256-cbc -K $encrypted_a0a084cfe161_key -iv $encrypted_a0a084cfe161_iv -in .travis/deploy_rsa.enc -out /tmp/deploy_rsa -d - - eval "$(ssh-agent -s)" - - chmod 600 /tmp/deploy_rsa - - ssh-add /tmp/deploy_rsa - - git config --global user.name "hackdapp" - - git config --global user.email "hackdapp@gmail.com" - - git submodule init - - git submodule update - -install: - - npm install - -script: - - hexo cl - - hexo g - - hexo d - -after_script: - branches: - only: - - source diff --git a/.travis/deploy_rsa.enc b/.travis/deploy_rsa.enc deleted file mode 100644 index b67025cd..00000000 Binary files a/.travis/deploy_rsa.enc and /dev/null differ diff --git a/source/CNAME b/CNAME similarity index 100% rename from source/CNAME rename to CNAME diff --git a/README.md b/README.md deleted file mode 100644 index 81ad76d6..00000000 --- a/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Readme - -## MyBlog: [https://www.hackdapp.com](https://www.hackdapp.com) - ----- - -## DApp教程 - -1. [巧用HistoryApiAction实现对链数据的存储与查询](https://www.hackdapp.com/archives/eosdev_datastorage_historyaction.html) -2. [使用EOS.js发布EOS智能合约](https://www.hackdapp.com/archives/eosdev_deploycontract_eosjs.html) -3. [剖析EOS合约编译ABI文件](https://www.hackdapp.com/archives/eosdev_contract_abi.html) -4. [C++导读(EOS完全开发指南)](https://www.hackdapp.com/archives/eosdev_cplus_intro.html) -5. [C++基础语法(EOS完全开发指南)](https://www.hackdapp.com/archives/eosdev_cplus_basic.html) - ----- - -## EOS完整开发手册 - -[https://www.hackdapp.com/edusmart/](https://www.hackdapp.com/edusmart/) - ----- - -## 好物分享 - -[好物推荐](https://www.hackdapp.com/things/) - ----- - -## 学习周报 - -- [学习周报-10W]() -- [学习周报-09W]() -- [学习周报-08W]() -- [学习周报-07W]() -- [学习周报-06W]() -- [学习周报-05W]() -- [学习周报-04W]() -- [学习周报-03W]() -- [学习周报-02W]() -- [学习周报-01W]() diff --git a/_config.yml b/_config.yml deleted file mode 100644 index c691579d..00000000 --- a/_config.yml +++ /dev/null @@ -1,109 +0,0 @@ -# Hexo Configuration -## Docs: https://hexo.io/docs/configuration.html -## Source: https://github.com/hexojs/hexo/ - -# Site -title: HackDApp -subtitle: Focus on DApp tutorials, Thinking growth, Mac skills, IndieMaker, etc. -description: Connect each programmer and create your own SideProject via Idea💡️ -> Build🛠️ -> Launch🚀️ -> Grow🌱 -> Monetize💰 -> Automate🤖️ -> Exit📁. > Show me your code. | HackDApp would like to share with you -keywords: DApp tutorials EOS Indie IndieMaker SideProject MAC推荐 效率工具 HackDApp愿与你分享 -author: zhangliang -language: en -timezone: Asia/Chongqing - -# URL -## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' -url: https://www.hackdapp.com -root: / -# permalink: :year/:month/:day/:title/ -# permalink: archives/:abbrlink.html -permalink: archives/:url.html -permalink_defaults: - url: index -# abbrlink: -# alg: crc32 # 算法:crc16(default) and crc32 -# rep: hex # 进制:dec(default) and hex - -# Directory -source_dir: source -public_dir: public -tag_dir: tags -archive_dir: archives -category_dir: categories -code_dir: downloads/code -i18n_dir: :lang -skip_render: - - - -# Writing -new_post_name: :title.md # File name of new posts -default_layout: post -titlecase: false # Transform title into titlecase -external_link: true # Open external links in new tab -filename_case: 0 -render_drafts: false -post_asset_folder: false -relative_link: false -future: true -highlight: - enable: true - line_number: false - auto_detect: true - tab_replace: - -# Home page setting -# path: Root path for your blogs index page. (default = '') -# per_page: Posts displayed per page. (0 = disable pagination) -# order_by: Posts order. (Order by date descending by default) -index_generator: - path: '' - per_page: 7 - order_by: -date - -# Category & Tag -default_category: uncategorized -category_map: -tag_map: - -# Date / Time format -## Hexo uses Moment.js to parse and display date -## You can customize the date format as defined in -## http://momentjs.com/docs/#/displaying/format/ -date_format: YYYY-MM-DD -time_format: HH:mm:ss - -# Pagination -## Set per_page to 0 to disable pagination -per_page: 7 -pagination_dir: page - -# Extensions -## Plugins: https://hexo.io/plugins/ -## Themes: https://hexo.io/themes/ -theme: maupassant - -# Deployment -## Docs: https://hexo.io/docs/deployment.html -deploy: - type: git - repo: git@github.com:hackdapp/hackdapp.github.io.git - branch: master - -search: - path: search.xml - field: post - format: html - limit: 10000 - -wechatpay: http://7wy48o.com1.z0.glb.clouddn.com/2016-11-20_qrcode_wechatpay.jpg - -inline_images: - enabled: true - limit: 100000 - -#hexo sitemap -sitemap: - path: sitemap.xml -baidusitemap: - path: baidusitemap.xml diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..5ead6d70 --- /dev/null +++ b/about/index.html @@ -0,0 +1,55 @@ +关于我 | HackDApp

关于我

name: zhangliang
wechat: rushking2009
github: http://github.com/hackdapp
公众号: hackdapp
欢迎关注公众号

+
+

Grownth Time Line

近期要做的事

    +
  • 主题视频搬运
  • +
  • 题新闻翻译
  • +
  • 打造工具矩阵
  • +
+

相关资料收集

+
\ No newline at end of file diff --git a/archives/2019/01/index.html b/archives/2019/01/index.html new file mode 100644 index 00000000..7f8792ba --- /dev/null +++ b/archives/2019/01/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2019/02/index.html b/archives/2019/02/index.html new file mode 100644 index 00000000..b0e3cd39 --- /dev/null +++ b/archives/2019/02/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2019/03/index.html b/archives/2019/03/index.html new file mode 100644 index 00000000..dfe70a99 --- /dev/null +++ b/archives/2019/03/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2019/04/index.html b/archives/2019/04/index.html new file mode 100644 index 00000000..5c288765 --- /dev/null +++ b/archives/2019/04/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2019/index.html b/archives/2019/index.html new file mode 100644 index 00000000..462d76e7 --- /dev/null +++ b/archives/2019/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2019/page/2/index.html b/archives/2019/page/2/index.html new file mode 100644 index 00000000..7e31a457 --- /dev/null +++ b/archives/2019/page/2/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2019metalife.html b/archives/2019metalife.html new file mode 100644 index 00000000..3e81f577 --- /dev/null +++ b/archives/2019metalife.html @@ -0,0 +1,30 @@ +2019MetaLife | HackDApp

2019MetaLife

新年愿意清单

+
    +
  • 尝试每天500字,锻炼文字组织能力
  • +
  • 做一款自己的小众产品,用户达到100人
  • +
  • 尝试录制短视频
  • +
  • 出版一本书籍
  • +
+
波场Tron-可快捷开发的实战工程模板
\ No newline at end of file diff --git a/archives/2021-02-27T16:00:00.000Z.html b/archives/2021-02-27T16:00:00.000Z.html new file mode 100644 index 00000000..e69de29b diff --git a/archives/2021/02/index.html b/archives/2021/02/index.html new file mode 100644 index 00000000..577fae08 --- /dev/null +++ b/archives/2021/02/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2021/04/index.html b/archives/2021/04/index.html new file mode 100644 index 00000000..9d1bef94 --- /dev/null +++ b/archives/2021/04/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2021/06/index.html b/archives/2021/06/index.html new file mode 100644 index 00000000..552a1c3d --- /dev/null +++ b/archives/2021/06/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/2021/index.html b/archives/2021/index.html new file mode 100644 index 00000000..5acfed44 --- /dev/null +++ b/archives/2021/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git "a/archives/20210428-\345\246\202\344\275\225\346\217\220\351\253\230\351\230\262\347\214\235\346\255\273\347\232\204\350\203\275\345\212\233.html" "b/archives/20210428-\345\246\202\344\275\225\346\217\220\351\253\230\351\230\262\347\214\235\346\255\273\347\232\204\350\203\275\345\212\233.html" new file mode 100644 index 00000000..a4ed04a4 --- /dev/null +++ "b/archives/20210428-\345\246\202\344\275\225\346\217\220\351\253\230\351\230\262\347\214\235\346\255\273\347\232\204\350\203\275\345\212\233.html" @@ -0,0 +1,33 @@ +如何提高防猝死的能力 | HackDApp

如何提高防猝死的能力

猝死就是平时身体健康、或貌似健康的患者,在出乎意料的短时间内,因自然疾病而突然死亡.

+

猝死,如此可怕,是哪些原因导致的呢?
85%是心血管问题,这其中,又有80%是给心脏供血的冠状动脉突发缺血了。

+

那么,猝死我们可以预防或控制吗?
好消息是,绝大部分情况可以,前提是你要有足够的心脏储备。而储备,是心血管健康里最容易被忽视的一个维度。所谓心力储备,就是心脏因身体的需要而增加射血的能力。所以,大部分情况下,猝死是由于心力储备坍塌导致的。

+

逻辑上有三种策略可以进行预防:

+
    +
  1. 避免最后一根稻草策略。能引发猝死的事情,我们不要去做。比如: 大量喝酒或咖、心情抑郁、暴饮暴食等等。要注重先兆,要比发现最后一稻草更有效;
  2. +
  3. 关注身体信号策略。我们要注意引发猝死的先兆,也就是去注意储备透支的信号。
  4. +
  5. 拓展储备策略。这也是最重要的一种策略。既然储备是一种潜能,那我们就要努力去拓展它
  6. +
+

原文链接: https://www.dedao.cn/article/w06eGYrQb1gzVxBryXPl73kZRqOaB8

+
如何做好课堂笔记
\ No newline at end of file diff --git a/archives/Sun Feb 28 2021 00:00:00 GMT+0800 (China Standard Time).html b/archives/Sun Feb 28 2021 00:00:00 GMT+0800 (China Standard Time).html new file mode 100644 index 00000000..34864016 --- /dev/null +++ b/archives/Sun Feb 28 2021 00:00:00 GMT+0800 (China Standard Time).html @@ -0,0 +1,31 @@ +交易者应掌握的能力 | HackDApp

交易者应掌握的能力

无论是在股市或是币市,我们都希望通过自己的一顿神操作,买到那些可以让自己瞬间反几倍甚至几十倍的股票或数字货币,但现实情况
会告诉你,即使是牛市你也能亏钱亏的要死。

+

为什么呢?这就不得不想想其中你想赚钱的行为,是一种投机还是投资?

+

投机呢,完全可能就是全凭着几个火热大群的fomo情绪,亦或是好巧不巧的几个自己认为重要的小道消息,就认为自己拿到了人生财富密码,知道自己输的底朝天;而投资往往是通过自己对标的物,花精力与时间去研究思考,挖机出它的长期价值,尤其是那些被低估的标的,即使是自己决策失误,也会总结教训,从错误中反思,改进自己的投资方法论,不错失提升自己大脑🧠成长的机会。

+

韭菜之所以是韭菜,就因为再每一次决策失误的时候不去学习反思,丧失了每一次成长的机会,慢慢就变成了一根老韭菜。

+

所以,在赚钱这条路上,我们慢慢培养总结自己的投资方法论,并在实践过程中不断反思复盘完善自己的投资逻辑。

+
+

思考带来决策,决策带来行动,行动改变命运,,行动改变命运!

+
+
如何用61分钟写出漂亮的推广文案
\ No newline at end of file diff --git a/archives/eosdev_contract_abi.html b/archives/eosdev_contract_abi.html new file mode 100644 index 00000000..e6ba4b62 --- /dev/null +++ b/archives/eosdev_contract_abi.html @@ -0,0 +1,101 @@ +剖析EOS合约编译ABI文件 | HackDApp

剖析EOS合约编译ABI文件

相信不少开发者朋友在进行EOS合约开发时,都看到发布智能合约时的ABI文件。那ABI文件到底是什么东西?在EOS公链环境中到底发挥怎么样的作用呢以及如何解读ABI文件内容呢?

+

那么本章节将带你了解ABI文件与智能合约间的关系以及了解并学会ABI文件的编写。

+

ABI, 简称(Application Binary Interface), 是一个基于JSON语言的接口描述文档,用于描述EOS合约以及如何对合约方法进行调用。如果大家曾经接触过websocket、avro、hession、thrift等这类技术的化,那么是大体逻辑是相向的。比如websocket所提供的wsdl其实也是对websocket本身对外所提供服务的接口描述。

+

在EOS合约,ABI文件是由开发组件eosio.cdt工具包中的eosio-cpp命令执行所生成的文件。但在实际开发时,时常会碰到一些情况无法生成ABI文件。因为在合约开发,我们往往会根据业务自定义一些数据结构,或者使用一些第三方方法,而eosio.cdt本身对所有特隆并不是支持的很完善,所以时常导致编译失败,这时就需要我们理解ABI是如何定义智能合约的,以便于我们定制化修改自己的合约描述。

+

ABI文件结构是由什么组成的呢?让我们先看一个示例

+
{
"version": "eosio::abi/1.0",
"types": [],
"structs": [],
"actions": [],
"tables": [],
"ricardian_clauses": [],
"abi_extensions": [],
"___comment" : ""
}
+

上面json示例展示了一个标准智能合约所应具备的完整属性定义。

+

数据类型(type)
在项目开发过程,有时为了便于代码的理解,我们会将一些通用数据类型或数据结构进行别名定义,用一个在业务场景中更加贴合业务的名称代替。在types数组中便是对这种情况的定义描述。

+

比如:

{
"new_type_name": "age",
"type": "int"
}

或者

{
"new_type_name": "name",
"type": "string" //此处user为自定义数据结构
}

+

对于合约内嵌类型,是不会在此展示的。诸如: uint64_t、name、asset、symbol等。下图展示了EOS合约所支持的所有内置数据类型

+
+

结构体(struct)
在业务处理逻辑中,为了方便数据的传输与调用,往往我们会对针对业务数据进行建模并以结构体的形式展现。同样,它也需要在ABI文件中进行描述。

+

比如: eosio.token合约中的account结构体定义

+
    +
  • ABI文件定义

    +
    {
    "name": "account",
    "base": "",
    "fields": [
    {
    "name": "balance",
    "type": "asset"
    }
    ]
    }
    +
  • +
  • eosio.token.hpp实现

    +
    struct account {
    asset balance;

    uint64_t primary_key()const {
    return balance.symbol.code().raw();
    }
    };
    +
  • +
+

另外,需要注意的就是除了以上这种结构体定义,其实还存在一种隐性结构体,即:合约方法参数
示例:

+
    +
  • eosio.token.hpp中transfer方法定义

    +
    void transfer( name    from,
    name to,
    asset quantity,
    string memo );
    +
  • +
  • eosin.token合约中transfer方法在ABI文件中定义

    +
    {
    "name": "transfer",
    "base": "",
    "fields": [
    {
    "name": "from",
    "type": "name"
    },
    {
    "name": "to",
    "type": "name"
    },
    {
    "name": "quantity",
    "type": "asset"
    },
    {
    "name": "memo",
    "type": "string"
    }
    ]
    }
    +
  • +
+

可以看出,隐性结构体与前面所定义显性结构体定义是并没有什么不同,只是在智能合约业务逻辑中,我们仅用到显性结构体来存储我们的业务数据进行逻辑判断。

+
+

方法(Action)
Action数组主要用于描述外部可调用的方法列表以及具体的参数列表。在智能合约中,如果需要对外公开合约方法,往往会在合约头文件中进行如下定义:

[[eosio::action]]
void transfer(name from,name to, asset quantity, string memo);

+

而ABI的表现形式为:

{
"name": "transfer",
"type": "transfer",
"ricardian_contract": ""
}

+

从上述描述可以看出,在方法的类型定义关联了前面的隐性结构体类型。虽然在此处,方法名与隐性结构体类型命名一致,但实际情况并不一定非要相同。

+
+

表定义(Table)
关于表的ABI定义,相比其他几种定义要稍复杂一些。具体JSON定义如下

{
"name": "",
"type": "",
"index_type": "",
"key_names" : [],
"key_types" : []
}

+

JSON中字段说明如下:

+
    +
  • name
    合约初始化表时所要使用的名称
  • +
  • type
    表对应的数据结构体。也就是前面所说的显性结构体类型
  • +
  • index _type
    此类型为表主键类型
  • +
  • key _names
    索引字段列表
  • +
  • key_types
    索引字段数据类型列表。数据长度与索引字段列表长度一致。需要说明的是索引字段类型,只支持uint64_t,uint128 _t,uint256 _t,double,long double五种类型
    示例:eosio.token合约中的accounts表
  • +
  • ABI表定义

    +
    {
    "name": "accounts",
    "type": "account",
    "index_type": "i64",
    "key_names": ["primary_key"],
    "key_types": ["uint64"]
    }
    +
  • +
  • 表合约代码

    +
    struct [[eosio::table]] account {
    asset balance;

    uint64_t primary_key()const { return balance.symbol.code().raw(); }
    };
    +
  • +
+

从表合约代码可以看来,只需要在数据结构体代码中添加eosio-table标签就可以完成对表的定义操作。

+

之所以提供多索引的实现,主要还是为了应对业务场景中不同维度的数据查询,而且支持按升序或降序的遍历方式处理业务。

+
+

ricardian条款(ricardian_clauses)
该数组主要用于定义一种基于文本的合约宪法。通过其与智能合约的整合,来解决一些无法通过程序来判定的情况。

+

示例如下:

"ricardian_clauses": [{
"id": "Warranty",
"body": "WARRANTY. The invoker of the contract action shall uphold its Obligations under this Contract in a timely and workmanlike manner, using knowledge and recommendations for performing the services which meet generally acceptable standards set forth by EOS.IO Blockchain Block Producers.\n\n"
},{
"id": "Default",
"body": "DEFAULT. The occurrence of any of the following shall constitute a material default under this Contract: \n\n"
},{
"id": "Remedies",
"body": "REMEDIES. In addition to any and all other rights a party may have available according to law, if a party defaults by failing to substantially perform any provision, term or condition of this Contract, the other party may terminate the Contract by providing written notice to the defaulting party. This notice shall describe with sufficient detail the nature of the default. The party receiving such notice shall promptly be removed from being a Block Producer and this Contract shall be automatically terminated. \n \n"
}
]

+

我们可以针对智能合约或者具体的合约方法,附加上对应的文本合约描述。比如针对方法的文本合约定义:

+
    +
  • ABI定义

    +
    "actions": [{
    "name": "hi",
    "type": "hi",
    "ricardian_contract": "# CONTRACT FOR hello::hi## ACTION NAME: hi\n### Parameters### Parameters\nInput parameters:Input parameters:\n\n* `user` (string to include in the output)* `user` (string to include in the output)\n\nImplied parameters: Implied parameters: \n\n* `account_name` (name of the party invoking and signing the contract)* `account_name` (name of the party invoking and signing the contract)\n\n### Intent### Intent\nINTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.\n\n### Term### Term\nTERM. This Contract expires at the conclusion of code execution.TERM. This Contract expires at the conclusion of code execution.\n"
    }]
    +
  • +
  • 代码及文件定义(hello.hi_rc.md)

    +
    # CONTRACT FOR hello::hi

    ## ACTION NAME: hi

    ### Parameters
    Input parameters:

    * `user` (string to include in the output)

    Implied parameters:

    * `account_name` (name of the party invoking and signing the contract)

    ### Intent
    INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.

    ### Term
    TERM. This Contract expires at the conclusion of code execution.
    +
  • +
+
+

ABI Extensions
该功能将允许用户进行自定义区块扩展, 包括对数据的签名、编码等。不过现在该属性暂未被应用支持。

+
+

到此,相信大家对于整个ABI文件的结构应该有了大体的认识与理解。这样大家可以在研究其他智能合约时,可以首先阅读对方的ABI文件,就可以熟悉对方的整体接口框架。

+
+
+

在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

+
+
+

changelog
2019-03-07 zhangliang

+
    +
  • 初次发稿
  • +
+
使用EOS.js发布EOS智能合约
\ No newline at end of file diff --git a/archives/eosdev_cplus_basic.html b/archives/eosdev_cplus_basic.html new file mode 100644 index 00000000..3fe28a6c --- /dev/null +++ b/archives/eosdev_cplus_basic.html @@ -0,0 +1,50 @@ +C++基础语法(EOS完全开发指南) | HackDApp

C++基础语法(EOS完全开发指南)

Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

+
/* filename: myapp.cpp
date: 2019-01-28 3:06 PM
auth: zhangliang<zhangliang@cldy.org> */

#include <iostream> //定义头文件
#include <stdlib.h>

int main()
{
using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string

string msg = "hi, my first dapp"; //定义变量

cout << msg <<endl; //打印字符串
}

//tryit: http://tpcg.io/Tulum1
+

以上代码便是C++最简单可运行的最小示例。基本包含了在程序结构中所必须的一些语言特性。

+

根据上述程序结构,我们可以大致将它拆分成五部分内容:

+ +

1. #include <iostream>

头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。

+

比如:通过引用<cmath>库,可以帮助我们快速使用里面的函数进行一些数学运算。

+

函数列表

+

所以,后续我们需要学会便是如何查阅C++文档库,不断积累与完善对于第三方标准库的方法学习与理解。

+

2. int main()

main函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。

+
#include <iostream>
#include <stdlib.h>

using namespace std;

string sayHi(string username)
{
return string("hi, ").append(username).append("!");
}

int main()
{
cout << sayHi("www.hackdapp.com") << endl;
}
//tryit: http://tpcg.io/uHUkzy
+

函数定义,其实对于所有编程语言的定义方式大致相同, 都可以表现为以下形式

+
<返回类型|void> 方法名(参数定义1, 参数定义2,参数定义...)
{
//do some stuff
return <返回数据>
}
+

如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。

+

注: 在后续的第二部分,我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。

+

3. string message = "hi, my first app"

变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。

+

而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。
我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。

+

尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。

+

换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。

+

另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。

+

4. cout << msg <<endl

coutiostream函数库中的一个流数据输出函数,一般用于在程序调用过程向控制台输入一些调试信息;与此对应的是cin, 用于接收输入数据流。

+

不过, 在EOS合约中无法调用此函数。举而代之的是,EOSLIB库自己封装的print函数.

+

5. //单行注解 or /*多行注解*/

在程序开发过程,往往需要通过语言描述某个代码文件所要实现的整体功能或者某个函数的功能、参数及约束说明。这时候就需要用到注解。

+

而注解同样也所有的编程语言中也大致相同,一般分为单行注释与多行注释。

+

单行注释适用于短小的描述某一行运行逻辑;而多行注释多用于描述函数说明以及文件功能说明。

+
+

注: 在教程中如出现不易理解或存在错误的问题🐛,欢迎评论留言!

+
重塑思维:自律 VS 习惯
\ No newline at end of file diff --git a/archives/eosdev_cplus_intro.html b/archives/eosdev_cplus_intro.html new file mode 100644 index 00000000..c95a88bd --- /dev/null +++ b/archives/eosdev_cplus_intro.html @@ -0,0 +1,45 @@ +C++导读(EOS完全开发指南) | HackDApp

C++导读(EOS完全开发指南)

Contents

Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

+

本章节内容主要是带大家了解C++整个编程语言的体系架构,对C++编程语言有个整体的大致的认识与理解。另外,也是帮助大家在开发EOS智能合约之前做一下前期预习,易于对后面EOS合约的快速上手。

+

另外,需要说明的是,因为本身EOS智能合约是在一个沙箱机制中运行,所以它对一些标准函数库的方法进行了一些限制。所以可能导致大家可能在网上找的资料中的方法无法在合约中正常执行。

+ +

另一个角度讲,正是由于这种限制,也是减小了我们的学习范围,这样我们就不需要完全掌握的整个C++的语言体系,便可以开发智能合约。比如:文件操作读取,时间函数,随机数,这些在EOS合约里是都不可用的。 不过,有一个问题就是你无法明确知道哪些功能被禁用了,只能去试。或者官网有说明,可能我没有看到而已。

+

在整个开发过程,你只需要学会使用一些基础语法,简单数据类型、数据结构以及常用的一些工具库。比如:如何处理字符串,如何存储或操作数据结构。

+

除此之外,再掌握一些程序设计技巧,就可以实战开发自己的DApp应用了,而本身程序设计其实是与哪种程序语言不存在直接关系的,只是让你的程序有更好的应对扩展。

+

通过本章节内容你可以学会:

+
    +
  • 对基础数据类型以及它们的数据边界有清晰的认识;
  • +
  • 学会如何使用不同数据结构处理业务场景中的问题;
  • +
  • 学会如何定义自己的函数;
  • +
  • 学会如何面对对象的思维设计自己的合约;
  • +
  • 学会如何通过模板封装形成自己的工具库;
  • +
  • 了解一些常用的标准库文件及常用的函数工具方法;
  • +
  • 学会如何通过手册查找工具函数
  • +
+
+

本章节,将会从以下八个部分进行分类介绍:

+

1.1 C++基础语法
1.2 基础数据类型及变量、常量定义
1.3 结构体及函数定义
1.4 数据结构
1.5 面向对象编程
1.6 高级应用(模板定义)
1.7 标准库及库函数
1.8 资源及经验分享

+
+

注: 在教程中如出现不易理解或存在错误的问题🐛,欢迎评论留言!

+
C++基础语法(EOS完全开发指南)
\ No newline at end of file diff --git a/archives/eosdev_datastorage_historyaction.html b/archives/eosdev_datastorage_historyaction.html new file mode 100644 index 00000000..34cecac8 --- /dev/null +++ b/archives/eosdev_datastorage_historyaction.html @@ -0,0 +1,58 @@ +巧用HistoryApiAction实现对链数据的存储与查询 | HackDApp

巧用HistoryApiAction实现对链数据的存储与查询

在开发EOS DApp智能合约时,我们都知道可以使用multi_index来对合约数据的存储与查询,但合约的存储是需要消耗一定的资源的,而且随着用户的增长往往会导业务数据会越来越大,从而导致合约需要更多的资源来支撑其数据。

+

有时我们可以通过业务设计,让业务数据得到即时清理及资源释放。但大多数情况下,业务数据是不允许清理的,那么针对这种情况是否有其他办法来降低对合约存储资源的消耗呢?

+

那么,今天分享的方案就是:借用EOS链提供的history_api_action插件服务、内部合约Action调用来完成对业务数据的存储与查询。

+

举个🌰️:
在去中心化交易所中,往往搓合成功会产生大量的成交订单,那保存在合约数据库中肯定是不合适的,所以可以在搓合方法中通过调用内部日志方法的形式,通过交易日志来将订单数据写入区块中;然后通过EOS节点提供的查询历史action接口,查询合约日志数据并增量同步到中心化数据库。

+

下面,我们将通过具体的代码示例来帮助大家理解整个过程:

+
+

首先,我们新创建一个合约(dexchange.hpp/dexchange.cpp);

//dexchange.hpp
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

CONTRACT dexchange : public contract {
public:
using contract::contract;
dexchange(eosio::name receiver, eosio::name code, datastream<const char*> ds):contract(receiver, code, ds) {}

[[eosio::action]]
void executetrade(uint64_t pair_id, uint64_t sell_order_id, uint64_t buy_order_id);

[[eosio::action]]
void log(uint64_t deal_price, uint64_t quantity, uint64_t sell_order_id, uint64_t buy_order_id);

};

EOSIO_DISPATCH(dexchange, (executetrade)(log))

//https://gist.github.com/2b68242019242bdd12f174208e39e7d2

+

然后,定义并实现两个方法:executetrade、log。 executetrade合约方法负责搓合业务,当搓合业务处理完之后调用log方法,通过交易信息将参数调用数据写入区块中;

+
//filename: dexchange.cpp

#include "dexchange.hpp"

void dexchange::executetrade(uint64_t pair_id, uint64_t sell_order_id, uint64_t buy_order_id){
uint64_t deal_price = 1200;
uint64_t quantity = 10000;

action(
permission_level{ _self, "active"_n },
_self, "log"_n,
std::make_tuple(deal_price, pair_id, sell_order_id, buy_order_id)
).send();
}

void dexchange::log(uint64_t deal_price, uint64_t quantity, uint64_t sell_order_id, uint64_t buy_order_id){
require_auth( _self );
}

//https://gist.github.com/ea6ec431a57faee3a2823cfeee406efd
+

从以上示例可以看出,合约log日志方法其实并不需要做任何业务逻辑处理。只需要间接被调用,便可将我们需要的业务数据通过交易的形式记录在区块中,而不会浪费我们的合约存储空间,也不需要担心资源释放的问题。

+

下一步、发布智能合约,并调用一次executetrade合约方法

+
//发布合约至hackdappexch合约帐户
> cleos set contract hackdappexch contracts/ -p hackdappexch@active

//执行合约方法
> cleos push action hackdappexch executetrade '[1,2,3]' -p hackdappexch@active
+

最后,通过EOS链节点提供的RPC服务,进行历史action数据查询,通过数据过滤找到我们的日志方法及参数数据。

+

在确保之前的操作都成功之后,我们使用curl命令查询其对应服务:

+
curl --request POST \
--url https://localhost:8888/v1/history/get_actions \
--header 'content-type: application/x-www-form-urlencoded; charset=UTF-8' \
--data '{"pos":-1,"offset":-10,"account_name":"hackdappexch"}'
+

通过此接口查询出来的数据不仅仅是log合约方法数据,可能还会存在该合约的其他方法事件,需要根据情况再过滤一次数据。

+

+

补充说明

+

如果你在本地曾经搭建过EOS私链的化,那么或许看到过,EOS启动时是可以配置不同插件。而其中有一个插件history_api_plugin,就是用于监听并存储合约方法的调用信息;另外启动链节点时,是可以按规划自由指定所要监听的合约帐户及方法,如: --filter-on hackdappexch::log, 该参数配置表示只监听hackdappexch合约中的log方法。

+
nodeos -e -p eosio -d /mnt/dev/data \
--config-dir /mnt/dev/config \
--http-validate-host=false \
--plugin eosio::producer_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_api_plugin \
--http-server-address=0.0.0.0:8888 \
--access-control-allow-origin=* \
--contracts-console \
--filter-on hackdappexch:log: \
--max-transaction-time=1000 \
--verbose-http-errors &
+

如以上EOS节点启动命令,就展示了启动一个EOS节点的具体参数配置。其中,--filter-on参数便是指定只监听记录hackdappexch合约的log方法调用数据。

+

所以,当我们要通过链节点RPC服务查询合约方法历史调用数据时,需要先确认提供RPC服务的节点是否开启了history_api_plugin插件,以及自己所要查询的合约是否在其过滤规则之中。

+
+

小结

+

通过本篇文章,我们学会了利用内部合约方法调用 ➕️ 链节点历史Action查询的方式实现业务数据的另一种数据存储与查询方案。

+
+
+

在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

+
+

+
+

changelog

2019-03-13 zhangliang

+
    +
  • 初次发稿
  • +
+
零基础体验EOS入门合约开发
\ No newline at end of file diff --git a/archives/eosdev_deploycontract_eosjs.html b/archives/eosdev_deploycontract_eosjs.html new file mode 100644 index 00000000..50d3514a --- /dev/null +++ b/archives/eosdev_deploycontract_eosjs.html @@ -0,0 +1,56 @@ +使用EOS.js发布EOS智能合约 | HackDApp

使用EOS.js发布EOS智能合约

在之前的EOS合约开发文章,你可能学会了如何通过EOS系统命令cleos set contract的方式进行智能合约的发布与升级。

+

但在开发过程中,可能有的同学持续在命令容器与开发IDE间频繁切换,对开发效率有一定程序的影响,那是否有一种更好的方式帮助我们在一个窗口里快速发布合约呢?

+

那么本文将带你了解如何通过EOS.js进行智能合约的发布

+


如上图所示,在进行合约发布时,需要用到eos系统合约中的两个方法:setcode、setabi。而这两个方法分别会用到智能合约编译后的两个文件: *.wasm、*.abi。

+

注意 : 本文示例中使用的eosjs的版本为16.0.9

+

首先,需要初始化EOS-SDK实例。 事先准备好初始化SDK所必需的参数:

+
    +
  • chainid
    所要发布的目标EOS链chainid. 例如:正式chainid: aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906; jungle测试网chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473等等
  • +
  • httpEndpoint
    EOS链环境http接口地址。 例如: http://localhost:8888
  • +
  • keyProvider
    合约帐户私钥,主要用于交易签名。
  • +
+
//config.js
const Eos = require('eosjs')

const eos = Eos({
chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
httpEndpoint: "http://localhost:8888",
keyProvider: "5K7mtrinTFrVTduSxizUc5hjXJEtTjVTsqSHeBHes1Viep86FP5",
broadcast: true,
sign: true
})

module.exports = {
eos,
}

//https://gist.github.com/hackdapp/2522411b98b1acdadc0d842f712ca6e0
+

下一步,需要代码实现对合约文件夹中的.wasm及.abi文件的读取;

+
function getDeployableFilesFromDir(dir) {
const dirCont = fs.readdirSync(dir)
const wasmFileName = dirCont.find(filePath => filePath.match(/.*\.(wasm)$/gi))
const abiFileName = dirCont.find(filePath => filePath.match(/.*\.(abi)$/gi))
if (!wasmFileName) throw new Error(`Cannot find a ".wasm file" in ${dir}`)
if (!abiFileName) throw new Error(`Cannot find an ".abi file" in ${dir}`)
return {
wasmPath: path.join(dir, wasmFileName),
abiPath: path.join(dir, abiFileName),
}
}

//https://gist.github.com/69b29103e5cc114f4478390076d8ad39
+

然后,通过调用eos实例,分别执行系统合约的setcode/setabi方法,从而达到智能合约的发布;

+
function deployContract({ account, contractDir }) {
const { wasmPath, abiPath } = getDeployableFilesFromDir(contractDir)

const wasm = fs.readFileSync(wasmPath)
const abi = fs.readFileSync(abiPath)

const codePromise = eos.setcode(account, 0, 0, wasm)
const abiPromise = eos.setabi(account, JSON.parse(abi))
return Promise.all([codePromise, abiPromise])
}

//https://gist.github.com/69b29103e5cc114f4478390076d8ad39
+

最后,调用deployContract方法,测试合约发布功能。

+
deployContract({ account: "eosio.token", contractDir: "./contract" }).then((result) => {
console.log(`Deployment successful`, JSON.stringify(result, null , 4))
})
.catch(err => {
console.error(`Deployment failed`, err)
})

//https://gist.github.com/69b29103e5cc114f4478390076d8ad39
+
+

小结

+

通过本文我们学习了如何通过eos实例的setcode/setabi方法将合约编译文件快速发布到指定链环境。

+

另外,如果为了提高发布合约效率,我们还可以在package.json中定义发布合约的运行脚本,并配合IDE工具中的快捷键,便可达到开发效率的进一步提升。

+
+
+

在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

+
+

+

注: 有想了解愿码全思维IT工程师加速器的朋友,可以扫码加群咨询。

+
+

changelog

2019-03-12 zhangliang

+
    +
  • 初次发稿
  • +
+
巧用HistoryApiAction实现对链数据的存储与查询
\ No newline at end of file diff --git a/archives/how-to-impl-nft-proj.html b/archives/how-to-impl-nft-proj.html new file mode 100644 index 00000000..31a21c8d --- /dev/null +++ b/archives/how-to-impl-nft-proj.html @@ -0,0 +1,52 @@ +基于以太坊的NFT开发实践 | HackDApp

基于以太坊的NFT开发实践

课程大纲

第一部分、项目总览

    +
  • 项目产品介绍
  • +
  • 代码工程介绍
  • +
  • 技术架构讲解
  • +
  • 基础概念讲解(ERC20、ERC1155、ERC721)
  • +
+

第二部分、产品架构及功能设计

    +
  • 产品架构图
  • +
  • 业务流程图
  • +
  • 技术架构图
  • +
+

第三部分、产品开发及用例测试

1)智能合约开发

    +
  • 基础环境配置
  • +
  • 搭建本地链环境
  • +
  • 开发工程构建
  • +
  • 合约设计
  • +
  • 合约测试
  • +
+

2)IPFS部署与集成

3)前端页面开发

第四部分、产品部署

    +
  • 发布静态工程至github仓库gh-page,并配置公网域名
  • +
  • 发布智能合约至测试网
  • +
+

第五部分、线上演示及功能验证

    +
  • 安装MetaMask
  • +
  • 发布NFT
  • +
  • 交易NFT
  • +
  • 转帐NFT
  • +
  • ……
  • +
+
\ No newline at end of file diff --git a/archives/how-to-improve-return-risk-ratio.html b/archives/how-to-improve-return-risk-ratio.html new file mode 100644 index 00000000..e00801c8 --- /dev/null +++ b/archives/how-to-improve-return-risk-ratio.html @@ -0,0 +1,28 @@ +如何提高收益风险比 | HackDApp

如何提高收益风险比

什么是收益风险比呢? 字面意思不难理解,就是: 收益风险比 = 可能的收益 / 未知的风险。

+

为什么需要认识并提升自己的收益风险比呢? 因为像我这样打工人,除了工资之外,就没有其他收入了,如果被辞职或家里出些什么事,无论是家庭生活质量还是自己的心理焦虑,都会受到极大的生存压力。而投资作为被动收入的一种手段,就可以提升我们在工作单一收入上的安全度,而提升收益风险比,就是在这一基础上能够获得更大的回报。

+

那么如何提高收益风险比呢?很简单:
一、提高分子值,即:让自己的可能收益的概率更高。那么如何做到呢?比如:筛选优质投资标的;选择合适的投资时机;长线持有,防止频繁操作,被甩下车的可能;
二、降低分母值,即:降低投资对自己生活的风险影响程度。如何做呢?比如:设置止损线,尽量让损失控制在自己可以接受的心理价位;按自己的风险承受能力,设置投资金额占总资产的百分比;增加场外赚钱能力,充沛的现金流在一定程序上可以降低自己的投资焦虑。

+

通过合理的收益风险比的控制,可以让我们在整个投资过程中,除了降低一些心理焦虑压力,还能获取更高的投资回报,并最终提升我们的家庭生活质量以及风险承受能力。

+

2021年,希望自己在数字货币投资领域,能够有个好的收获!

+
交易者应掌握的能力
\ No newline at end of file diff --git a/archives/how-to-make-goodnotes.html b/archives/how-to-make-goodnotes.html new file mode 100644 index 00000000..3bdd9a13 --- /dev/null +++ b/archives/how-to-make-goodnotes.html @@ -0,0 +1,24 @@ +如何做好课堂笔记 | HackDApp

如何做好课堂笔记

+
基于以太坊的NFT开发实践
\ No newline at end of file diff --git a/archives/how_to_write_ad_fast.html b/archives/how_to_write_ad_fast.html new file mode 100644 index 00000000..6336b567 --- /dev/null +++ b/archives/how_to_write_ad_fast.html @@ -0,0 +1,44 @@ +如何用61分钟写出漂亮的推广文案 | HackDApp

如何用61分钟写出漂亮的推广文案

最近,接触了不少通过推荐产品的联盟推广平台,只要你能通过自己的语言或文字,说服别人通过你的链接购买对应商品,那么你就能从中抽取一定的佣金。比如:将京东或淘宝联盟里的产品,通过知乎、蜜源、小红书等平台进行文案宣传。

+

在推广过程,你会很快发现,如何能够更好的说报用户,就往往就要考虑一个人的文案能力,当然不仅仅是文字功度,更重要的是你更懂得将适当的产品推送给最需要的人。这其中,就需要你多思考,如何挖掘产品卖点,如何通过数据了解客户需要什么等等。

+

对于一些专门写广告文案的高手来讲,往往都有一套自己的写作套路或者方法论,以提高自己的产出效率及效果。最终考验你的不是你写了多少字,而是到底转化多少用户进行付费。

+

今天,也是机缘巧合,刷推的时候发现一篇推文觉得写得挺不错的,所以也翻译过来与大家共同学习成长。

+

推主的整个写作框架,共拆分成11个小步骤,来实现“花最小的努力产出最好的效果”。

+

01/ 花10分钟, 收集广告主资料

了解你所要推广产品的广告主是谁,经营什么产品,产品解决什么问题,这一切只需要你从对方官网都可以快速了解。除了你从广告主直接获取的信息之外,你还需要通过Google检索与之相竞争的对手与产品是什么。

+

02/ 花5分钟,阅读广告主介绍

好好阅读上一步骤所收集到的广告主资料信息。想一想,如果广告主找你聊具体的推广信息,而你对自己的客户一无所知,是不是有点说不过去,所以要提前做好功课。

+

03/ 花5分钟,找到一个卖点

你要明白每一个产品往往都会有很多优点或者好处,你不可能使用有限的篇幅来顾及所有信息。所以,你需要依照自己的推广平台的文字限制,来选择性的介绍1个或多个产品卖点。

+

04/ 花1分钟,确定CTA

通过添加CTA(Call to action)链接或按钮,可以更容易说服用户采取下一步行动,有利于促进点击率或转化率。CTA要具备三个要素:要推广人们立即行动,而不是晚点再说;应该要求行动,而不是建议行动;引导人们行动的流程要足够简单。

+

比如:错误示例,“LearnMore”,“Download”,没有告诉用户所要获得的好处;好的示例,“Get My Free EBook”、“Get 50% Off My Ebook Now”

+

05/ 花10分钟,持续输出文字

通过之前对于广告主及产品的了解、选定的推广卖点以及CTA等多方面的了解,用自己的文字进行快速组织介绍,把所有能想到的文字尽量输出出来,不要担心写的好不好,通顺不通顺,你可以理解为列草稿。

+

06/ 花10分钟,将自己的头脑冷静一下

对于刚输出的内容,自己的思维可能一直处于一种惯性思维之中。试着将这种思维冷却下来,才可能更加理性的看待问题。

+

07/ 花6分钟,重新省视自己的文案

你可以通过大声朗读自己的文案,以及换位思考,假如你是读者,感受如何。另外,尽量使用客户有依据的数字来支撑你的表达,从而提升说服力。

+

08/ 花6分钟,检查自己的表达逻辑

检查自己方案的表达逻辑是否合理,以及学会在适当的位置进行段落,可以减轻用户的阅读障碍。如何不知道写符合逻辑的推广文案,可以学习一下aida(营销模式)_百度百科

+

09/ 花8分钟,优化文案

检查自己的文案,是否存在不通顺、措词不当以及存在错别字的情况,把自己的每一段文案当成一个产品进行精打细磨。

+

10/ All done

到这一步,你能做都已经做了,剩下的就只能看广告在市场中的具体表现效果了。

+

而你呢,接下来所要做的事情,就是继续写一篇文案,以此往复,不断提高自己“Writing-》Sell”的文案能力。

+

参考资料

+
如何提高防猝死的能力
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html new file mode 100644 index 00000000..8f79337f --- /dev/null +++ b/archives/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html new file mode 100644 index 00000000..014fbd05 --- /dev/null +++ b/archives/page/2/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html new file mode 100644 index 00000000..0ef6bf7f --- /dev/null +++ b/archives/page/3/index.html @@ -0,0 +1,13 @@ +Archive | HackDApp
\ No newline at end of file diff --git a/archives/rebuildbrain_habit.html b/archives/rebuildbrain_habit.html new file mode 100644 index 00000000..3bf43415 --- /dev/null +++ b/archives/rebuildbrain_habit.html @@ -0,0 +1,47 @@ +重塑思维:自律 VS 习惯 | HackDApp

重塑思维:自律 VS 习惯

自律使我压抑,习惯助我成长。 自律与习惯,其实目标都是一致的,只是所产生的行动动力源是不相同的。

+

相信每个人都在不停的思考一个问题,“我如何才能使明天的自己比今天的自己更加优秀一些呢?”

+

为了让自己变得更好,我们去总结规律,改变自我认知,希望能从不断的思维升级过程中,锻造出属于自己的思维工具,培养及丰富问题症结的方案库。

+

为了让自己变得更好,我们需要靠意志去坚持去做一件让自己变得优秀的事情,但你发现一段时间之后,这件事不了了知,扔那儿放下了,因为这样的事在我的人生当中简直太熟悉不过了。

+

相反,有一些行为却长期固化下来了,比如我们的一些日常洗漱习惯,即使你中途有一段时间没去做,那你也不会放弃这件事。

+

当某一种行为已经成为你的习惯时,如果你有意识的去观察一下,会发现一些许规律。比如:刷牙,可能现在没有不早晚刷牙的童鞋吧。不妨想一想这个行为大家保持了多少年,到现在是否还需要各种精神动力去推着自己去做这个事吗?

+

明显不需要,可以说这已经是写入自己骨头里的一种惯性行为,你要是不注意都不发现它原来其实就是一个号的学习榜样。因为它太习以为常了,平常的都忘掉它的存在。

+

那既然刷牙可以养成习惯,那我们其他行为为啥就不能养成一种习惯呢?

+

首先,处于习惯性的行为执行过程并不会让你特别有心理负担;
其次,习惯中的行为并不会消耗自己稀缺的精力;
最后,行为关联及导向性。也就是习惯行为之间的联动开关。比如:洗漱的时候总能与刷牙这件事产生一定的链接,而这个链接往往就是我们通过意识去不断增强脑回路而形成的。

+

之所以总结这些,就是因为我身上的一件事,当时看李笑来的专栏里曾经提到一种感受,就是“不做这件事就难受”。 当时是在是无法理解这种状态,除了吃饭这件事,找不出天天不做就难受的事来,当你无法从自身找到可以参考的例子时,你总是无法理解其概念。

+

直到我发现身上这件事,刮胡子。对,你没看错,就是刮胡子。

+

为什么讲呢?因为之前总是用电动剃须刀,总是容易忘记用,时做时不做的,而且刮的也不是太干净。直到有一天看到京东做活动卖手动剃须刀,想着买来试一试,但当时也犹豫,每天早上用这个会不会特花时间啊。

+

但事实证明,相比电动剃须刀,手动的虽然要麻烦一些,时间也要多花费一些。但这件事我却坚持了一年,直至今日从心理感受来讲,自己并没有感觉每天要逼着自己去做这件事,而是很自觉的每天洗漱后自动进入刮胡子状态。

+

为什么会这样呢?因为每一次刮完胡子,对着镜子一照,感觉干净清爽,漂亮,帅气。让我从内心看到一个舒服的自己,这算不算是一种仪式感呢。

+

后来,我总结了一下习惯养成的一个关键因素:持续的心理反馈。反馈可以让我们感受到变化与进步,或是一种心理满足;而持续性一来可以增强行为的动力,二过可以慢慢促进脑回路的链接建立。

+

那么,如何建立自己的习惯养成路径呢?那就是

+
    +
  1. 先制定一个你绝对认可其价值的目标;
  2. +
  3. 在意识中建立诱导因子,也就是你需要在已形成的习惯之中,建立一个与新行动的触感连接;
  4. +
  5. 持续反馈,每天都要总结,让自己内心见证成长,而后通过持续达到巩固行动的动力。
  6. +
+

小结

好的习惯、应用技巧及思维方式是可以产生复利效应价值的,关键在于它不是形式上的应用,不是为技巧而技巧,一定是在我们的生活或工作实际场景中解决实际问题,并以此不断反馈价值收获,而持续的价值收益又会加强我们执行的动力,最终形成一个正向向上的良性循环♻️。

+

执行力其实是落实行动的第一要素,所以我们需要学会如何去补充这项能源。而最好的方式就是让自己认可这件事的价值。并且能够在做事的过程中,有深刻的反馈与心理感受,学会记录自己的心理变化。

+

最后,通过不断的执行与反馈,增强我们的脑回路链接。久而久之,就会成为我们的习惯。

+
剖析EOS合约编译ABI文件
\ No newline at end of file diff --git a/archives/simple_cpllus_code.html b/archives/simple_cpllus_code.html new file mode 100644 index 00000000..11deabcd --- /dev/null +++ b/archives/simple_cpllus_code.html @@ -0,0 +1,64 @@ +C++简单程序入门 | HackDApp

C++简单程序入门

/* filename: myapp.cpp
date: 2019-01-28 3:06 PM
auth: 55269778@qq.com */

#include <iostream> //定义头文件
#include <stdlib.h>

int main()
{
using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string

string msg = "hi, my first dapp"; //定义变量

cout << msg <<endl; //打印字符串
}

//tryit: http://tpcg.io/Tulum1
+

以上代码便是C++最简单可运行的最小示例。基本包含了在程序结构中所必须的一些语言特性。

+

根据上述程序结构,我们可以大致将它拆分成五部分内容:

+

1. #include <iostream>

头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。

+

比如:通过引用\<cmath>库,可以帮助我们快速使用里面的函数进行一些数学运算。

+

+

所以,后续我们需要学会便是如何查阅C

+

2. int main()

main函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。

+
#include <iostream>
+#include <stdlib.h>
+
+using namespace std;
+
+string sayHi(string username)
+{
+    return string("hi, ").append(username).append("!");
+}
+
+int main()
+{
+    cout << sayHi("www.hackdapp.com") <<endl;
+}
+//tryit: http://tpcg.io/uHUkzy
+

函数定义,其实对于所有编程语言的定义方式大致相同, 都可以表现为以下形式

+
<返回类型|void> 方法名(参数定义1, 参数定义2,参数定义...)
+{
+    //do some stuff
+    return <返回数据>
+}
+

如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。

+

注: 后续我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。

+

3. string message = "hi, my first app"

变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。

+

而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。
我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。

+

尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。

+

换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。

+

另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。

+

4. cout << msg <<endl

coutiostream函数库中的一个流数据输出函数,一般用于在程序调用过程向控制台输入一些调试信息;与此对应的是cin, 用于接收输入数据流。

+

不过, 在EOS合约中无法调用此函数。举而代之的是,EOSLIB库自己封装的print函数.

+

5. //单行注解 or /*多行注解*/

在程序开发过程,往往需要通过语言描述某个代码文件所要实现的整体功能或者某个函数的功能、参数及约束说明。这时候就需要用到注解。

+

而注解同样也所有的编程语言中也大致相同,一般分为单行注释与多行注释。

+

单行注释适用于短小的描述某一行运行逻辑;而多行注释多用于描述函数说明以及文件功能说明。

+
如何提高收益风险比
\ No newline at end of file diff --git a/archives/think_habit.html b/archives/think_habit.html new file mode 100644 index 00000000..476c0a64 --- /dev/null +++ b/archives/think_habit.html @@ -0,0 +1,45 @@ +坚持的长性 | HackDApp

坚持的长性

+

今天早上算是被媳妇嘲笑了一番,为啥呢?

+

因为之前自己有一段时间,为了背英语单词,所以早起了一个月,而如今早一天晚一天,早起完全看心情。

+

媳妇给出的评价就是:用劲过猛,要么及早要么极迟,完全是一种过激行为。

+

同时她也给出建议:只要比上班的时间多出一小时其实就可以做很多事情。重要的是常态化。

+
+

2019开始了,自己确没开始。以前都早早给自己作出各种规划,对比现在,还不如之前的自己吗?不应该是每年比前一年好一些吗或者每天比昨天好一些吗?

+

哦,也可能是最近超忙,导致各种规划的推迟。但内心同时又会想起另外一种声音:不,你不是,你只是懒。事情没把你逼到一种绝境上,你是不会立即行动的。

+

2019要做的事

    +
  1. 早起,不早起怎么做重要的事;而且希望能找到一些习惯思维方式;
  2. +
  3. 持续写作,写一本自己的技术书籍,打造自己的硬核;
  4. +
  5. 持续总结,不犯过去犯的错,少走弯路;
  6. +
  7. 思考习惯养成路径,以便培养自己新习惯的有效成功率
  8. +
+

注:事情不在多,夯实好这几点。

+

目前的状态

    +
  • 时不时早起起来做一些事情,可能是工作上的,也可能是生活上的,但缺少对书的阅读;另外,感觉早上精力特别出奇的好,是否应该做一些最重要的事情,而读书的化放在晚上的时候。
  • +
  • 未达到持续写东西的地步,需要检讨;可能存在的原因: 对于第二天早上要写的东西,前一天没有大致规划;或者说并不需要规划,每天早上写的时候就按之前的套路写就可以了,不讲究一次写完写完美,而是持续写出自己的每个内容点,草稿结束后再修改,也是告诉自己好文章是持续修改出来的,不可能写完就扔那儿了,而是要持续完善。包括今天写的这篇,其实也是由之前早上写的卡片扩展而来的。
  • +
  • 总结之前过于重视形式化。总结对于我来讲,总感觉认可但又未给予足够的重视,因为总是断断续续的写一些自检清单。可能这个和习惯的养成也是一样,归根到底是没有成长的即视感,也就是没有反馈。比如:刮胡子,为什么要举这个例子呢?因为之前用电动剃须刀时,总是时不时刮一次;而用手动刮胡刀后,发现自己几乎每天都会坚持这件事。当时再想为什么这件事能坚持的如此之前呢?那其他事情怎么不能坚持下去呢?我是否能够从刮胡子这件事情中找到自己内心的那一份认识与感受呢。后来才发现,那是因为刮胡子这件事能让我内心出现一份好形象不邋遢的意识。洗漱的时候就是在潜意识里调动这份动力,而且在刮完胡子后更加让自己内心得以满足,这不正是一种仪式感吗?
  • +
  • 正在有意识,感受自己每天坚持做一件事情的内心是如何的?
  • +
+

所以,如果要让某个行为成为你的习惯,你就要从内心上提高对它的认可,以及最重要的一件事,你要寻找你的内心感受,是什么让你满足。如果这个不好理解的话,我给你的建议就是观察你已有的习惯中想想那是一种什么感觉,做个比较可能会更形象一些。

+
C++导读(EOS完全开发指南)
\ No newline at end of file diff --git a/archives/tron_boilerplate.html b/archives/tron_boilerplate.html new file mode 100644 index 00000000..9b3d0dcf --- /dev/null +++ b/archives/tron_boilerplate.html @@ -0,0 +1,90 @@ +波场Tron-可快捷开发的实战工程模板 | HackDApp

波场Tron-可快捷开发的实战工程模板

 _                         _           _ _                 _       _
| |_ _ __ ___ _ __ | |__ ___ (_) | ___ _ __ _ __ | | __ _| |_ ___
| __| '__/ _ \| '_ \ _____| '_ \ / _ \| | |/ _ \ '__| '_ \| |/ _` | __/ _ \
| |_| | | (_) | | | |_____| |_) | (_) | | | __/ | | |_) | | (_| | || __/
\__|_| \___/|_| |_| |_.__/ \___/|_|_|\___|_| | .__/|_|\__,_|\__\___|
|_|
+

Tron-Boilerplate, 是基于Tron公链的一套可快速搭建本地私链环境、发布合约以及配置完整的标准工程模板。

+

该工程模板旨在于帮助大家快速工程化本地开发环境,减少环境搭建以及调试开发流程过程中所需花费的大量时间,让大家将更多精力投入到产品设计与核心业务逻辑实现上。

+

使用提供的工程模板,可从以下四个方面提升开发效率:

+
    +
  • 一键启动或暂停私链环境
  • +
  • 一键编译智能合约
  • +
  • 一键发布智能合约
  • +
  • 一键单元测试(jtest)
  • +
+

同时,本工程模板附带了一个完整的示例代码(Todolist),可供大家参考与学习。示例效果如下:

+ +

+

最后,开发人员只需按照项目工程结构,编写自己的智能合约、前端页面及与SDK交互逻辑即可。

+
+

前置依赖

1. 安装docker

Install Docker for Mac : https://docs.docker.com/docker-for-mac/
Install Docker for Windows: https://docs.docker.com/docker-for-windows/install/

+

更多资料可参考: https://docs.docker.com

+

2. 安装node

To install or update nvm, you can use the install script using cURL:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

+

or wget

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

+

The script clones the nvm repository to /.nvm and adds the source line to your profile (/.bash_profile, /.zshrc, /.profile, or /.bashrc)._

+
export NVM_DIR="${XDG_CONFIG_HOME/:-$HOME/.}nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
+

更多资料可参考: https://github.com/creationix/nvm#installation

+

3. 安装jdk8

JDK8: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

+

如果大家不使用tron提供的tron-studio开发合约的化,可以选择不安装此项。因为使用tronbox同样也可以编译以及发布合约。

+

4. 安装tronbox

npm install -g tronbox
+

+

注:对于最新的 Java-Tron Odyssey 3.2 版本,最小兼容的 TronBox 版本是 TronBox 2.2.1。请确保您已安装此版本。

+

更多资料:https://cn.developers.tron.network/docs/%E5%85%A5%E9%97%A8

+

5. 开发工具

开发工具可根据自己喜好自由选择,个人比较推荐VSCode

+

官网链接:https://code.visualstudio.com/

+

工程安装与使用

1. 克隆工程

git clone git@github.com:ChainDesk/tron_boilerplate.git
+

工程结构介绍

# 项目地址: https://github.com/ChainDesk/tron_boilerplate
# 注:待工程稳定后,可能会考虑做成插件,可使用yeoman快速构建,欢迎大家star.
.
├── README.md
├── bin
│   ├── libs
│   │   └── TronStudio.jar //TronStudio开发工具包
│   ├── start_docker.sh //启动私链
│   ├── start_tronstudio.sh //启动TronStudio
│   └── stop_docker.sh //停止私链
├── build //合约编译生成目录
│   └── contracts
│   ├── HelloWorld.json //示例合约ABI, HelloWorld
│   ├── Migrations.json
│   └── TodoList.json //示例合约ABI, TodoList
├── contracts //合约目录,大家合约都放在这儿
│   ├── HelloWorld.sol
│   ├── Migrations.sol
│   └── TodoList.sol
├── migrations //发布合约目录
│   ├── 1_initial_migration.js
│   └── 2_deploy_contracts.js //新添加的合约需要在此文件中定义,否则无法通过tronbox deploy命令发布
├── package-lock.json
├── package.json //前端App工程及依赖包定义,以及多个服务启动命令。
├── public
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
├── src //前端React代码目录
│   ├── TodoList.js
│   ├── contracts
│   │   └── TodoList.json //合约ABI文件
│   ├── index.js
│   ├── serviceWorker.js
│   └── tronweb.js //新启动的工程,需要根据私链生成的私钥以及新发布的合约地址在此重新修改。
├── test //jtest测试目录,方便大家编写测试用例
│   └── web.test.js
├── tronbox-config.js
└── tronbox.js //发布合约所依赖的配置,此文件定义了本地、测试以及正式网络的http访问地址

12 directories, 27 files

+

2. 工程初始化

npm install
+

这一步主要用于更新前端框架react所依赖的包文件,依赖包安装成功后,会在工程目录下看到一个node_modules文件夹。

+

如果你的前端选型不是react的化,也可根据自己需求进行依赖包配置修改。

+

3. 正式开发流程

3.1 启动链环境

执行cmd+shift+p,调用vscode的命令列表,选择run task从中选择start_docker任务_

+


同样,如果要停止当前docker环境,只需选择stop_docker脚本即可。_

+

所有的执行任务配置默认只存在两个地方:

+
    +
  • tron_boilerplate/.vscode/tasks.json_
  • +
  • package.json中的scripts
    大家可根据自己需要进行添加或修改,而且也可以通过IDE本身的快捷键映射对应的任务。
  • +
+

3.2 发布合约

运行task任务,然后从中选择npm deploy, 即可发布当前所有合约至私链环境。

+

+

合约发布成功后,会显示如下:

+
Using network 'development'.

Running migration: 1_initial_migration.js
Replacing Migrations...
Migrations:
(base58) TBC7CqpjBxGUt9Z9hhM4QNRFF5osvG3j6r
(hex) 410d68b1bfd19d341bd0f772fad8697432d0d771be
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing TodoList...
TodoList:
(base58) TFyEw5qRRiZTJ5boLZJxZnv2hnhpBuvkjm
(hex) 4141d25df475fe0c053a9e2ed3a77faa10329185f0
Saving successful migration to network...
Saving artifacts...
+

3.3 修改配置参数

打开文件, tron_boilerplate/src/tronweb.js, 代码如下: _

...
const fullNode = new HttpProvider('http://127.0.0.1:8090');
const solidityNode = new HttpProvider('http://127.0.0.1:8091');
const eventServer = 'http://127.0.0.1:8092';

const privateKey = "<私钥地址>";
const contractAddr = "<合约地址>";
......

+

3.4 启动react服务

执行cmd+shift+p,调用vscode的命令列表,选择run task从中选择npm start即可启动前端服务。

+

+

打开浏览器,访问http://localhost:3000, 验证是否成功。

+
+

到此,整个工程的搭建及开发流程就介绍完毕,如中间出现任何问题欢迎加我个人微信咨询。

+

开发资料

+
+
+

在教程中如出现不易理解或存在错误的问题,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

+
+
坚持的长性
\ No newline at end of file diff --git a/archives/try_eoscontract_dev.html b/archives/try_eoscontract_dev.html new file mode 100644 index 00000000..afa42e0c --- /dev/null +++ b/archives/try_eoscontract_dev.html @@ -0,0 +1,130 @@ +零基础体验EOS入门合约开发 | HackDApp

零基础体验EOS入门合约开发

本教程主要面向初阶开发人员,目的在于带领大家以最简单的示例合约,通过简单但不失完整的流程,体验整个合约的编译、发布与调用过程,从而让大家从直观角度有个清晰的概念认识。

+
+

版本说明
测试网公链版本: v1.7.0-dirty
EOSjS-SDK版本:16.0.9
开发组件包(CDT): 1.5.0

+
+

一、帐户管理

1. Register EOS Account

生成公私钥

在进行帐户注册时,需要事先提供一对公私钥地址,以便在注册帐号时进行绑定使用。可通过EOS Key Generation网站进行公私钥地址生成。

+

注册帐户

通过Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)网站进行EOS帐户的创建

点击图中标红create account, 在弹出界面中,填写事先生成的公钥地址


见上图中,需要填写三个信息,其中account name主要用于填写我们易于记忆的帐户名称,但其帐户名称长度只允许12位长度,且其组成字符也只能从a-z, 1-5以及一个点符号组成。
至于owner public key和 active public key分别对应该帐户owner权限和active权限。如果从安全角度讲,两个权限所对应的公钥地址应该设置成不一样的,这样当active private key丢失的时候,可以使用ower权限对active权限对应的公钥地址进行更换。因为ower和active权限是有层次关系的,只允许低级权限对下次权限进行操作。在不丢失ower私钥的情况下,也可以实现对ower权限地址的更换操作。

+

点击create, 创建成功后,会显示如下信息

+

2. Claim EOS


Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)页面,点击菜单栏中的Faucet按钮,会弹出如下界面

+

3. Balance Query


Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)页面,点击菜单栏中的account info按钮,弹出如下界面:

填写帐号名称后,点击get按钮, 便可以查到该用户的EOS余额及公钥地址信息。

+

4. Install Chrome Plugin: Scatter

安装scatter

在chrome浏览器中安装Chrome 网上应用店 - scatter插件。

+

注: 如果Chrome插件商店无法打开,则可以使用Start | Chrome Extension Downloader进行下载。scatter插件地址: https://chrome.google.com/webstore/detail/scatter/ammjpmhgckkpcamddpolhchgomcojkle?hl=zh-CN

+

插件安装完成后,可以chrome浏览器中看到如下高亮图标。

+

使用scatter

    +
  • 初始化scatter帐户
    填写密码,然后点击创建按钮

    点击创建操作后,会显示如下界面,提示保存12个助记词

    大家需要保存好这12个助词词,以便于在忘记密码时用助记词进行恢复。注:丢失此助记词则意味着你将永远丢失该帐户。

    +
  • +
  • 添加测试网络
    首先、打开主界面后,点击右上解系统设置

    然后,选择网络,新建网络

    填入测试网络的参数信息,比如: http://jungle2.cryptolions.io:80、chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473
    chaind的获取方式,可以直接通过http://jungle2.cryptolions.io/v1/chain/get_info进行查询

    +
  • +
  • 导入公私钥
    回到主界面,选择Key Pairs, 然后导入之前创建的私钥
  • +
  • 绑定EOS帐户
  • +
+

5. Buy(RAM、CPU、NET )

访问内存交易 - 钱包 - EOSX - Fastest EOS Block Explorer网站,绑定scatter帐号

+

+

购买RAM

购买CPU与NET资源

+

二、合约开发

1. 编写示例合约

在本地创建一个工程目录

~> mkdir -p mycontract/{utils, contracts}
~> tree
.
├── contracts
└── utils

+

在工程目录contracts文件下,创建hello.cpp,

~> touch contracts/hello.cpp

+

打开hello.cpp, 填写以下内容

#include <eosiolib/eosio.hpp>

using namespace eosio;

class [[eosio::contract]] hello : public contract {
public:
using contract::contract;

[[eosio::action]]
void hi( name user ) {
print( "Hello, ", user);
}
};

EOSIO_DISPATCH(hello, (hi))

+

2. 编译合约

该步骤需要用到EOS合约开发所必需的cdt开发工具包, 来完成对示例合约的编译工作。

+

1)在本地安装eosio-cpp工具命令

brew tap eosio/eosio.cdt //增加仓库
brew install eosio.cdt //安装工具包

+

注: 可使用eosin-cpp –help命令来查看所有参数说明

+

2)进行合约编译,生成abi合约描述文件及wasm合约文件

eosio-cpp -abigen 'contracts/hello.cpp' -o 'contracts/hello.wasm' --contract 'hackdappcom1'

+

编译完成后,会在工程目录生成hello.abi、hello.wasm两个编译文件。hello.abi就好比webservice中的wsdl描述语言一样,主要用于对合约接口及数据结构进行结构性描述, wasm文件为合约编译后的二进制文件。

+

ABI文件详细说明: 剖析EOS合约编译ABI文件 | HackDApp

+

3. 发布合约

初始化项目工程,并安装eosjs-sdk

使用npm init命令对项目进行初始化

~> npm init
package name: (mycontract)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/nolan/Desktop/mycontract/package.json:

{
"name": "mycontract",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

+

然后,使用npm install eosjs@16.0.9命令进行eos sdk组件安装

~> npm install eosjs@16.0.9

+

安装完成后, 整个项目工程目录结构显示如下:

~> tree
.
├── contracts //合约文件
├── node_modules //依赖组件
├── package-lock.json
├── package.json //工程配置定义
└── utils //工具库

3 directories, 2 files

+

编辑合约发布文件: deploy.js

首先,在工程根目录下,创建deploy.js;
然后,打开该文件,并填下以下内容;

const eos = require('./utils/eossdk')({
chainId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473",
httpEndpoint: "http://jungle2.cryptolions.io:80",
//更改处一: EOS合约Active权限权限
keyProvider: "5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu",// 更改处二: 改为要发布的合约帐户名称
authorization: 'hackdappcom1@active',
broadcast: true,
sign: true
})
const {deployContract} = require('./utils/common')

//更改处三:改为要发布的合约帐户名称
deployContract(eos, { account: "hackdappcom1", contractDir: "./contracts" }).then((result) => {
console.log(`Deployment successful`, JSON.stringify(result, null , 4))
})
.catch(err => {
console.error(`Deployment failed`, err)
})

+

最后,根据自己的帐户信息进行参数更改。

+

注:deploy.js文件头引入的两个文件eossdkcommon.js可直接点击链接下载,并放入工程目录utils文件夹中。

+

执行合约发布

编辑完成deploy.js相关参数数据, 通过node命令进行合约发布。

node deploy.js

+

运行命令之后,如果发布成功,会显示以下日志信息:

Deployment successful
[
{
"broadcast": true,
"transaction": {
"compression": "none",
"transaction": {
"expiration": "2019-04-03T06:50:55",
"ref_block_num": 25564,
"ref_block_prefix": 1344811314,
"max_net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
......
"account_ram_deltas": [
{
"account": "hackdappcom1",
"delta": -27
}
],
"except": null,
"inline_traces": []
}
],
"except": null
}
}
]

+

4. 合约调用

在确保合约发布成功之后,开始编写合约调用文件 invoke.js

~> touch invoke.js

+

打开invoke.js, 填入以下代码:

const eos = require('./utils/eossdk')({
chainId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473",
httpEndpoint: "http://jungle2.cryptolions.io:80",
keyProvider: "5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu",
authorization: 'hackdappcom1@active',
broadcast: true,
sign: true
})

const data = {
actions: [
{
account: 'hackdappcom1',
name: 'hi',
authorization: [{
actor: 'hackdappcom1',
permission: 'active'
}],
data: {"user": "222"}
}
]
}
eos.transaction(data).then((result)=>{
console.log(JSON.stringify(result.processed.action_traces[0].console, null, 4))
}).catch((err)=>{
console.log(err)
})

+

执行调用命令

node invoke.js

+

如果能够正常运行,则会显示以下内容信息

"Hello, 222"

+

另外,针对教程中出现的代码,我提供了完整的工程代码示例及文字稿教程。大家可点击链接或者直接克隆到本地进行查看。项目地址: https://github.com/hackdapp/learn_eos

+
+

可能出现的问题

    +
  1. 如果你没有事先购买RAM资源,可以会提示以下错误信息
    {
    "code": 500,
    "message": "Internal Service Error",
    "error": {
    "code": 3080001,
    "name": "ram_usage_exceeded",
    "what": "Account using more than allotted RAM usage",
    "details": [
    {
    "message": "account hackdappcom1 has insufficient ram; needs 26318 bytes has 5471 bytes",
    "file": "resource_limits.cpp",
    "line_number": 213,
    "method": "verify_account_ram_usage"
    }
    ]
    }
    }
    +
  2. +
+

测试网帐号

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
帐户名公钥私钥
hackdappcom1EOS6LTWfM5ffbmjUhvwFnrU5QEBrmkzsRo2eXogr2h9oP8DUuzgAi5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu
hackdappcom2EOS6qCqbFLuYK5rGK9LDPzcboLqy4phrUxLXLrhLgXxVBpzLzsJke5Jnw2anG8Zzy6MuCNxvwmaX5Hu4B6de1uzuae5QyRrUFtyfL2Wo
hackdappcom3EOS57B3rxRBBUiTyZf9iBxsWyQnvEhq2H95wbBbjdzcLbV1gfJ4zy5Ju2NNc24q3jQ2Yc2JcvwWjtGVeAyuWcNsaNVb37u7cmRW56zgc
hackdappcom4EOS7i5Diz2uqXSpvutmV4DftBRrL1XASzxsSdWBGrgzngPoXhT2dk5K6nyWMvpfYnQqLhS545dm53exduJgDBLHMYQ6SCNaPmeHjGZdr
hackdappcom5EOS6NcaFvvoekuBjhZLsBVywiMcN7VTVmgvAdA5srgTvQMeDmdiAH5JjN9efKokkgZYno2qjbE9C7WCGbVpPvgNArKDvcjbDic2pRGCS
+

参考资料

    +
  1. https://nadejde.github.io/eos-token-sale/
  2. +
  3. http://monitor.jungletestnet.io/#home
  4. +
  5. https://jungle.eosx.io/tools/ram/buy?symbol=10
  6. +
  7. https://github.com/hackdapp/learn_eos
  8. +
  9. https://chrome-extension-downloader.com/f944f5bf7bc58292048aa5b9bf29dc48/scatter.crx.crx.crx
  10. +
+
+

到此,整个EOS合约开发的流程就算介绍完毕。让我们再总结一下整体操作流程:

+
    +
  1. 生成两对公私地址,并进行EOS帐户注册
  2. +
  3. 通过jungle网站进行EOS币的领取,并对其进行余额查询
  4. +
  5. 安装Scatter插件,导入私钥并绑定新身份
  6. +
  7. 使用新注册的EOS帐户购买RAMCPUNET发布合约所需要的资源
  8. +
  9. 创建合约测试示例并编译
  10. +
  11. 编写发布合约脚本,替换合约帐户后进行合约发布
  12. +
  13. 编写合约方法调用脚本,调用合约中的hi方法进行日志打印。
    通过七个步骤我们了解了整个EOS合约开发的最简化操作流程。
  14. +
+
+

欢迎关注HackDApp博客或公众号, HackHook将持续为你分享IndieMaker成长路径、DAPP技术知识、高效Mac使用技巧、底层思维认知。

我的博客: https://www.hackdapp.com/
我的github: https://github.com/hackdapp
我的哔哩哔哩: https://space.bilibili.com/17360859
我的微信公众号: hackdapp

+

IndieMakers: https://www.indiemakers.cn

联系邮箱:55269778@qq.com

+
C++简单程序入门
\ No newline at end of file diff --git a/atom.xml b/atom.xml new file mode 100644 index 00000000..501df43e --- /dev/null +++ b/atom.xml @@ -0,0 +1,464 @@ + + + HackDApp + + Focus on DApp tutorials, Thinking growth, Mac skills, IndieMaker, etc. + + + + 2021-06-28T15:33:38.116Z + https://www.hackdapp.com/ + + + zhangliang + + + + Hexo + + + 基于以太坊的NFT开发实践 + + https://www.hackdapp.com/archives/how-to-impl-nft-proj.html + 2021-06-28T15:22:28.000Z + 2021-06-28T15:33:38.116Z + + 课程大纲

第一部分、项目总览

  • 项目产品介绍
  • 代码工程介绍
  • 技术架构讲解
  • 基础概念讲解(ERC20、ERC1155、ERC721)

第二部分、产品架构及功能设计

  • 产品架构图
  • 业务流程图
  • 技术架构图

第三部分、产品开发及用例测试

1)智能合约开发

  • 基础环境配置
  • 搭建本地链环境
  • 开发工程构建
  • 合约设计
  • 合约测试

2)IPFS部署与集成

3)前端页面开发

第四部分、产品部署

  • 发布静态工程至github仓库gh-page,并配置公网域名
  • 发布智能合约至测试网

第五部分、线上演示及功能验证

  • 安装MetaMask
  • 发布NFT
  • 交易NFT
  • 转帐NFT
  • ……
]]>
+ + + + + + <h2 id="课程大纲"><a href="#课程大纲" class="headerlink" title="课程大纲"></a>课程大纲</h2><h3 id="第一部分、项目总览"><a href="#第一部分、项目总览" class="headerlink" title= + + + + + + + + + +
+ + + 如何做好课堂笔记 + + https://www.hackdapp.com/archives/how-to-make-goodnotes.html + 2021-06-07T09:24:31.000Z + 2021-06-07T09:29:04.609Z + +

]]>
+ + + + + + <p><img src="http://cdn.hackdapp.com/2021-06-07-%E5%BF%85%E4%BF%AE%E4%BD%9C%E4%B8%9A1-D023-%E5%BC%A0%E4%BA%AE-%E5%8C%97%E4%BA%AC-hackdapp.pn + + + + + + + +
+ + + 如何提高防猝死的能力 + + https://www.hackdapp.com/archives/20210428-如何提高防猝死的能力.html + 2021-04-28T14:56:16.000Z + 2021-04-28T15:08:39.509Z + + 猝死就是平时身体健康、或貌似健康的患者,在出乎意料的短时间内,因自然疾病而突然死亡.

猝死,如此可怕,是哪些原因导致的呢?
85%是心血管问题,这其中,又有80%是给心脏供血的冠状动脉突发缺血了。

那么,猝死我们可以预防或控制吗?
好消息是,绝大部分情况可以,前提是你要有足够的心脏储备。而储备,是心血管健康里最容易被忽视的一个维度。所谓心力储备,就是心脏因身体的需要而增加射血的能力。所以,大部分情况下,猝死是由于心力储备坍塌导致的。

逻辑上有三种策略可以进行预防:

  1. 避免最后一根稻草策略。能引发猝死的事情,我们不要去做。比如: 大量喝酒或咖、心情抑郁、暴饮暴食等等。要注重先兆,要比发现最后一稻草更有效;
  2. 关注身体信号策略。我们要注意引发猝死的先兆,也就是去注意储备透支的信号。
  3. 拓展储备策略。这也是最重要的一种策略。既然储备是一种潜能,那我们就要努力去拓展它

原文链接: https://www.dedao.cn/article/w06eGYrQb1gzVxBryXPl73kZRqOaB8

]]>
+ + + + + + <p><strong>猝死就是平时身体健康、或貌似健康的患者,在出乎意料的短时间内,因自然疾病而突然死亡.</strong></p> +<p><strong>猝死,如此可怕,是哪些原因导致的呢?</strong><br>85%是心血管问题,这其中,又有80%是给心脏供血的冠状动脉突 + + + + + + + + + +
+ + + 如何用61分钟写出漂亮的推广文案 + + https://www.hackdapp.com/archives/how_to_write_ad_fast.html + 2021-04-07T10:09:14.000Z + 2021-04-07T12:28:02.909Z + + 最近,接触了不少通过推荐产品的联盟推广平台,只要你能通过自己的语言或文字,说服别人通过你的链接购买对应商品,那么你就能从中抽取一定的佣金。比如:将京东或淘宝联盟里的产品,通过知乎、蜜源、小红书等平台进行文案宣传。

在推广过程,你会很快发现,如何能够更好的说报用户,就往往就要考虑一个人的文案能力,当然不仅仅是文字功度,更重要的是你更懂得将适当的产品推送给最需要的人。这其中,就需要你多思考,如何挖掘产品卖点,如何通过数据了解客户需要什么等等。

对于一些专门写广告文案的高手来讲,往往都有一套自己的写作套路或者方法论,以提高自己的产出效率及效果。最终考验你的不是你写了多少字,而是到底转化多少用户进行付费。

今天,也是机缘巧合,刷推的时候发现一篇推文觉得写得挺不错的,所以也翻译过来与大家共同学习成长。

推主的整个写作框架,共拆分成11个小步骤,来实现“花最小的努力产出最好的效果”。

01/ 花10分钟, 收集广告主资料

了解你所要推广产品的广告主是谁,经营什么产品,产品解决什么问题,这一切只需要你从对方官网都可以快速了解。除了你从广告主直接获取的信息之外,你还需要通过Google检索与之相竞争的对手与产品是什么。

02/ 花5分钟,阅读广告主介绍

好好阅读上一步骤所收集到的广告主资料信息。想一想,如果广告主找你聊具体的推广信息,而你对自己的客户一无所知,是不是有点说不过去,所以要提前做好功课。

03/ 花5分钟,找到一个卖点

你要明白每一个产品往往都会有很多优点或者好处,你不可能使用有限的篇幅来顾及所有信息。所以,你需要依照自己的推广平台的文字限制,来选择性的介绍1个或多个产品卖点。

04/ 花1分钟,确定CTA

通过添加CTA(Call to action)链接或按钮,可以更容易说服用户采取下一步行动,有利于促进点击率或转化率。CTA要具备三个要素:要推广人们立即行动,而不是晚点再说;应该要求行动,而不是建议行动;引导人们行动的流程要足够简单。

比如:错误示例,“LearnMore”,“Download”,没有告诉用户所要获得的好处;好的示例,“Get My Free EBook”、“Get 50% Off My Ebook Now”

05/ 花10分钟,持续输出文字

通过之前对于广告主及产品的了解、选定的推广卖点以及CTA等多方面的了解,用自己的文字进行快速组织介绍,把所有能想到的文字尽量输出出来,不要担心写的好不好,通顺不通顺,你可以理解为列草稿。

06/ 花10分钟,将自己的头脑冷静一下

对于刚输出的内容,自己的思维可能一直处于一种惯性思维之中。试着将这种思维冷却下来,才可能更加理性的看待问题。

07/ 花6分钟,重新省视自己的文案

你可以通过大声朗读自己的文案,以及换位思考,假如你是读者,感受如何。另外,尽量使用客户有依据的数字来支撑你的表达,从而提升说服力。

08/ 花6分钟,检查自己的表达逻辑

检查自己方案的表达逻辑是否合理,以及学会在适当的位置进行段落,可以减轻用户的阅读障碍。如何不知道写符合逻辑的推广文案,可以学习一下aida(营销模式)_百度百科

09/ 花8分钟,优化文案

检查自己的文案,是否存在不通顺、措词不当以及存在错别字的情况,把自己的每一段文案当成一个产品进行精打细磨。

10/ All done

到这一步,你能做都已经做了,剩下的就只能看广告在市场中的具体表现效果了。

而你呢,接下来所要做的事情,就是继续写一篇文案,以此往复,不断提高自己“Writing-》Sell”的文案能力。

参考资料

]]>
+ + + + 如何用最少的时间写出最漂亮的广告推广文案呢?今天就向你推荐一个写作框架。,点击【ReadMore】,了解更多详情。 + + + + + + +
+ + + 交易者应掌握的能力 + + https://www.hackdapp.com/archives/Sun Feb 28 2021 00:00:00 GMT+0800 (China Standard Time).html + 2021-02-28T10:02:54.000Z + 2021-04-07T10:00:45.168Z + + 无论是在股市或是币市,我们都希望通过自己的一顿神操作,买到那些可以让自己瞬间反几倍甚至几十倍的股票或数字货币,但现实情况
会告诉你,即使是牛市你也能亏钱亏的要死。

为什么呢?这就不得不想想其中你想赚钱的行为,是一种投机还是投资?

投机呢,完全可能就是全凭着几个火热大群的fomo情绪,亦或是好巧不巧的几个自己认为重要的小道消息,就认为自己拿到了人生财富密码,知道自己输的底朝天;而投资往往是通过自己对标的物,花精力与时间去研究思考,挖机出它的长期价值,尤其是那些被低估的标的,即使是自己决策失误,也会总结教训,从错误中反思,改进自己的投资方法论,不错失提升自己大脑🧠成长的机会。

韭菜之所以是韭菜,就因为再每一次决策失误的时候不去学习反思,丧失了每一次成长的机会,慢慢就变成了一根老韭菜。

所以,在赚钱这条路上,我们慢慢培养总结自己的投资方法论,并在实践过程中不断反思复盘完善自己的投资逻辑。

思考带来决策,决策带来行动,行动改变命运,,行动改变命运!

]]>
+ + + + + + <p>无论是在股市或是币市,我们都希望通过自己的一顿神操作,买到那些可以让自己瞬间反几倍甚至几十倍的股票或数字货币,但现实情况<br>会告诉你,即使是牛市你也能亏钱亏的要死。</p> +<p>为什么呢?这就不得不想想其中你想赚钱的行为,是一种投机还是投资?</p> +<p>投机呢,完 + + + + + + + + + +
+ + + 如何提高收益风险比 + + https://www.hackdapp.com/archives/how-to-improve-return-risk-ratio.html + 2021-02-21T12:56:11.000Z + 2021-04-07T10:00:45.167Z + + 什么是收益风险比呢? 字面意思不难理解,就是: 收益风险比 = 可能的收益 / 未知的风险。

为什么需要认识并提升自己的收益风险比呢? 因为像我这样打工人,除了工资之外,就没有其他收入了,如果被辞职或家里出些什么事,无论是家庭生活质量还是自己的心理焦虑,都会受到极大的生存压力。而投资作为被动收入的一种手段,就可以提升我们在工作单一收入上的安全度,而提升收益风险比,就是在这一基础上能够获得更大的回报。

那么如何提高收益风险比呢?很简单:
一、提高分子值,即:让自己的可能收益的概率更高。那么如何做到呢?比如:筛选优质投资标的;选择合适的投资时机;长线持有,防止频繁操作,被甩下车的可能;
二、降低分母值,即:降低投资对自己生活的风险影响程度。如何做呢?比如:设置止损线,尽量让损失控制在自己可以接受的心理价位;按自己的风险承受能力,设置投资金额占总资产的百分比;增加场外赚钱能力,充沛的现金流在一定程序上可以降低自己的投资焦虑。

通过合理的收益风险比的控制,可以让我们在整个投资过程中,除了降低一些心理焦虑压力,还能获取更高的投资回报,并最终提升我们的家庭生活质量以及风险承受能力。

2021年,希望自己在数字货币投资领域,能够有个好的收获!

]]>
+ + + + + + <p>什么是收益风险比呢? 字面意思不难理解,就是: 收益风险比 = 可能的收益 / 未知的风险。</p> +<p>为什么需要认识并提升自己的收益风险比呢? 因为像我这样打工人,除了工资之外,就没有其他收入了,如果被辞职或家里出些什么事,无论是家庭生活质量还是自己的心理焦虑,都会 + + + + + + + + + +
+ + + C++简单程序入门 + + https://www.hackdapp.com/archives/simple_cpllus_code.html + 2019-04-04T04:00:00.000Z + 2021-04-07T09:31:42.557Z + +
/* filename: myapp.cpp
date: 2019-01-28 3:06 PM
auth: 55269778@qq.com */

#include <iostream>//定义头文件
#include <stdlib.h>

int main()
{
using namespace std;//命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string

string msg = "hi, my first dapp"; //定义变量

cout << msg <<endl;//打印字符串
}

//tryit: http://tpcg.io/Tulum1

以上代码便是C++最简单可运行的最小示例。基本包含了在程序结构中所必须的一些语言特性。

根据上述程序结构,我们可以大致将它拆分成五部分内容:

1. #include <iostream>

头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。

比如:通过引用\<cmath>库,可以帮助我们快速使用里面的函数进行一些数学运算。

所以,后续我们需要学会便是如何查阅C

2. int main()

main函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。

#include <iostream>#include <stdlib.h>using namespace std;string sayHi(string username){    return string("hi, ").append(username).append("!");}int main(){    cout << sayHi("www.hackdapp.com") <<endl;}//tryit: http://tpcg.io/uHUkzy

函数定义,其实对于所有编程语言的定义方式大致相同, 都可以表现为以下形式

<返回类型|void> 方法名(参数定义1, 参数定义2,参数定义...){    //do some stuff    return <返回数据>}

如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。

注: 后续我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。

3. string message = "hi, my first app"

变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。

而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。
我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。

尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。

换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。

另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。

4. cout << msg <<endl

coutiostream函数库中的一个流数据输出函数,一般用于在程序调用过程向控制台输入一些调试信息;与此对应的是cin, 用于接收输入数据流。

不过, 在EOS合约中无法调用此函数。举而代之的是,EOSLIB库自己封装的print函数.

5. //单行注解 or /*多行注解*/

在程序开发过程,往往需要通过语言描述某个代码文件所要实现的整体功能或者某个函数的功能、参数及约束说明。这时候就需要用到注解。

而注解同样也所有的编程语言中也大致相同,一般分为单行注释与多行注释。

单行注释适用于短小的描述某一行运行逻辑;而多行注释多用于描述函数说明以及文件功能说明。

]]>
+ + + + C++简单程序入门. 以最简单的示例代码,为你拆解其脉络结构。上手C++对你来说,那不是难事。 + + + + + + + + +
+ + + 零基础体验EOS入门合约开发 + + https://www.hackdapp.com/archives/try_eoscontract_dev.html + 2019-04-03T23:00:00.000Z + 2021-04-07T09:31:42.557Z + + 本教程主要面向初阶开发人员,目的在于带领大家以最简单的示例合约,通过简单但不失完整的流程,体验整个合约的编译、发布与调用过程,从而让大家从直观角度有个清晰的概念认识。


版本说明
测试网公链版本: v1.7.0-dirty
EOSjS-SDK版本:16.0.9
开发组件包(CDT): 1.5.0


一、帐户管理

1. Register EOS Account

生成公私钥

在进行帐户注册时,需要事先提供一对公私钥地址,以便在注册帐号时进行绑定使用。可通过EOS Key Generation网站进行公私钥地址生成。

注册帐户

通过Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)网站进行EOS帐户的创建

点击图中标红create account, 在弹出界面中,填写事先生成的公钥地址


见上图中,需要填写三个信息,其中account name主要用于填写我们易于记忆的帐户名称,但其帐户名称长度只允许12位长度,且其组成字符也只能从a-z, 1-5以及一个点符号组成。
至于owner public key和 active public key分别对应该帐户owner权限和active权限。如果从安全角度讲,两个权限所对应的公钥地址应该设置成不一样的,这样当active private key丢失的时候,可以使用ower权限对active权限对应的公钥地址进行更换。因为ower和active权限是有层次关系的,只允许低级权限对下次权限进行操作。在不丢失ower私钥的情况下,也可以实现对ower权限地址的更换操作。

点击create, 创建成功后,会显示如下信息

2. Claim EOS


Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)页面,点击菜单栏中的Faucet按钮,会弹出如下界面

3. Balance Query


Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)页面,点击菜单栏中的account info按钮,弹出如下界面:

填写帐号名称后,点击get按钮, 便可以查到该用户的EOS余额及公钥地址信息。

4. Install Chrome Plugin: Scatter

安装scatter

在chrome浏览器中安装Chrome 网上应用店 - scatter插件。

注: 如果Chrome插件商店无法打开,则可以使用Start | Chrome Extension Downloader进行下载。scatter插件地址: https://chrome.google.com/webstore/detail/scatter/ammjpmhgckkpcamddpolhchgomcojkle?hl=zh-CN

插件安装完成后,可以chrome浏览器中看到如下高亮图标。

使用scatter

  • 初始化scatter帐户
    填写密码,然后点击创建按钮

    点击创建操作后,会显示如下界面,提示保存12个助记词

    大家需要保存好这12个助词词,以便于在忘记密码时用助记词进行恢复。注:丢失此助记词则意味着你将永远丢失该帐户。

  • 添加测试网络
    首先、打开主界面后,点击右上解系统设置

    然后,选择网络,新建网络

    填入测试网络的参数信息,比如: http://jungle2.cryptolions.io:80、chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473
    chaind的获取方式,可以直接通过http://jungle2.cryptolions.io/v1/chain/get_info进行查询

  • 导入公私钥
    回到主界面,选择Key Pairs, 然后导入之前创建的私钥
  • 绑定EOS帐户

5. Buy(RAM、CPU、NET )

访问内存交易 - 钱包 - EOSX - Fastest EOS Block Explorer网站,绑定scatter帐号

购买RAM

购买CPU与NET资源

二、合约开发

1. 编写示例合约

在本地创建一个工程目录

~> mkdir -p mycontract/{utils, contracts}
~> tree
.
├── contracts
└── utils

在工程目录contracts文件下,创建hello.cpp,

~> touch contracts/hello.cpp

打开hello.cpp, 填写以下内容

#include <eosiolib/eosio.hpp>

using namespace eosio;

class [[eosio::contract]] hello : public contract {
public:
using contract::contract;

[[eosio::action]]
void hi( name user ) {
print( "Hello, ", user);
}
};

EOSIO_DISPATCH(hello, (hi))

2. 编译合约

该步骤需要用到EOS合约开发所必需的cdt开发工具包, 来完成对示例合约的编译工作。

1)在本地安装eosio-cpp工具命令

brew tap eosio/eosio.cdt //增加仓库
brew install eosio.cdt //安装工具包

注: 可使用eosin-cpp –help命令来查看所有参数说明

2)进行合约编译,生成abi合约描述文件及wasm合约文件

eosio-cpp -abigen 'contracts/hello.cpp' -o 'contracts/hello.wasm' --contract 'hackdappcom1'

编译完成后,会在工程目录生成hello.abi、hello.wasm两个编译文件。hello.abi就好比webservice中的wsdl描述语言一样,主要用于对合约接口及数据结构进行结构性描述, wasm文件为合约编译后的二进制文件。

ABI文件详细说明: 剖析EOS合约编译ABI文件 | HackDApp

3. 发布合约

初始化项目工程,并安装eosjs-sdk

使用npm init命令对项目进行初始化

~> npm init
package name: (mycontract)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /Users/nolan/Desktop/mycontract/package.json:

{
"name": "mycontract",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}

然后,使用npm install eosjs@16.0.9命令进行eos sdk组件安装

~> npm install eosjs@16.0.9

安装完成后, 整个项目工程目录结构显示如下:

~> tree
.
├── contracts//合约文件
├── node_modules//依赖组件
├── package-lock.json
├── package.json//工程配置定义
└── utils//工具库

3 directories, 2 files

编辑合约发布文件: deploy.js

首先,在工程根目录下,创建deploy.js;
然后,打开该文件,并填下以下内容;

const eos = require('./utils/eossdk')({
chainId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473",
httpEndpoint: "http://jungle2.cryptolions.io:80",
//更改处一: EOS合约Active权限权限
keyProvider: "5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu",// 更改处二: 改为要发布的合约帐户名称
authorization: 'hackdappcom1@active',
broadcast: true,
sign: true
})
const {deployContract} = require('./utils/common')

//更改处三:改为要发布的合约帐户名称
deployContract(eos, { account: "hackdappcom1", contractDir: "./contracts" }).then((result) => {
console.log(`Deployment successful`, JSON.stringify(result, null , 4))
})
.catch(err => {
console.error(`Deployment failed`, err)
})

最后,根据自己的帐户信息进行参数更改。

注:deploy.js文件头引入的两个文件eossdkcommon.js可直接点击链接下载,并放入工程目录utils文件夹中。

执行合约发布

编辑完成deploy.js相关参数数据, 通过node命令进行合约发布。

node deploy.js

运行命令之后,如果发布成功,会显示以下日志信息:

Deployment successful
[
{
"broadcast": true,
"transaction": {
"compression": "none",
"transaction": {
"expiration": "2019-04-03T06:50:55",
"ref_block_num": 25564,
"ref_block_prefix": 1344811314,
"max_net_usage_words": 0,
"max_cpu_usage_ms": 0,
"delay_sec": 0,
"context_free_actions": [],
......
"account_ram_deltas": [
{
"account": "hackdappcom1",
"delta": -27
}
],
"except": null,
"inline_traces": []
}
],
"except": null
}
}
]

4. 合约调用

在确保合约发布成功之后,开始编写合约调用文件 invoke.js

~> touch invoke.js

打开invoke.js, 填入以下代码:

const eos = require('./utils/eossdk')({
chainId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473",
httpEndpoint: "http://jungle2.cryptolions.io:80",
keyProvider: "5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu",
authorization: 'hackdappcom1@active',
broadcast: true,
sign: true
})

const data = {
actions: [
{
account: 'hackdappcom1',
name: 'hi',
authorization: [{
actor: 'hackdappcom1',
permission: 'active'
}],
data: {"user": "222"}
}
]
}
eos.transaction(data).then((result)=>{
console.log(JSON.stringify(result.processed.action_traces[0].console, null, 4))
}).catch((err)=>{
console.log(err)
})

执行调用命令

node invoke.js

如果能够正常运行,则会显示以下内容信息

"Hello, 222"

另外,针对教程中出现的代码,我提供了完整的工程代码示例及文字稿教程。大家可点击链接或者直接克隆到本地进行查看。项目地址: https://github.com/hackdapp/learn_eos


可能出现的问题

  1. 如果你没有事先购买RAM资源,可以会提示以下错误信息
    {
    "code": 500,
    "message": "Internal Service Error",
    "error": {
    "code": 3080001,
    "name": "ram_usage_exceeded",
    "what": "Account using more than allotted RAM usage",
    "details": [
    {
    "message": "account hackdappcom1 has insufficient ram; needs 26318 bytes has 5471 bytes",
    "file": "resource_limits.cpp",
    "line_number": 213,
    "method": "verify_account_ram_usage"
    }
    ]
    }
    }

测试网帐号

帐户名公钥私钥
hackdappcom1EOS6LTWfM5ffbmjUhvwFnrU5QEBrmkzsRo2eXogr2h9oP8DUuzgAi5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu
hackdappcom2EOS6qCqbFLuYK5rGK9LDPzcboLqy4phrUxLXLrhLgXxVBpzLzsJke5Jnw2anG8Zzy6MuCNxvwmaX5Hu4B6de1uzuae5QyRrUFtyfL2Wo
hackdappcom3EOS57B3rxRBBUiTyZf9iBxsWyQnvEhq2H95wbBbjdzcLbV1gfJ4zy5Ju2NNc24q3jQ2Yc2JcvwWjtGVeAyuWcNsaNVb37u7cmRW56zgc
hackdappcom4EOS7i5Diz2uqXSpvutmV4DftBRrL1XASzxsSdWBGrgzngPoXhT2dk5K6nyWMvpfYnQqLhS545dm53exduJgDBLHMYQ6SCNaPmeHjGZdr
hackdappcom5EOS6NcaFvvoekuBjhZLsBVywiMcN7VTVmgvAdA5srgTvQMeDmdiAH5JjN9efKokkgZYno2qjbE9C7WCGbVpPvgNArKDvcjbDic2pRGCS

参考资料

  1. https://nadejde.github.io/eos-token-sale/
  2. http://monitor.jungletestnet.io/#home
  3. https://jungle.eosx.io/tools/ram/buy?symbol=10
  4. https://github.com/hackdapp/learn_eos
  5. https://chrome-extension-downloader.com/f944f5bf7bc58292048aa5b9bf29dc48/scatter.crx.crx.crx

到此,整个EOS合约开发的流程就算介绍完毕。让我们再总结一下整体操作流程:

  1. 生成两对公私地址,并进行EOS帐户注册
  2. 通过jungle网站进行EOS币的领取,并对其进行余额查询
  3. 安装Scatter插件,导入私钥并绑定新身份
  4. 使用新注册的EOS帐户购买RAMCPUNET发布合约所需要的资源
  5. 创建合约测试示例并编译
  6. 编写发布合约脚本,替换合约帐户后进行合约发布
  7. 编写合约方法调用脚本,调用合约中的hi方法进行日志打印。
    通过七个步骤我们了解了整个EOS合约开发的最简化操作流程。

欢迎关注HackDApp博客或公众号, HackHook将持续为你分享IndieMaker成长路径、DAPP技术知识、高效Mac使用技巧、底层思维认知。

我的博客: https://www.hackdapp.com/
我的github: https://github.com/hackdapp
我的哔哩哔哩: https://space.bilibili.com/17360859
我的微信公众号: hackdapp

IndieMakers: https://www.indiemakers.cn

联系邮箱:55269778@qq.com

]]>
+ + + + 本教程主要面向初阶开发人员,目的在于带领大家以最简单的示例合约,通过简单但不失完整的流程,体验整个合约的编译、发布与调用过程,从而让大家从直观角度有个清晰的概念认识。 + + + + + + + + + + +
+ + + 巧用HistoryApiAction实现对链数据的存储与查询 + + https://www.hackdapp.com/archives/eosdev_datastorage_historyaction.html + 2019-03-13T08:36:13.000Z + 2021-04-07T09:31:42.556Z + + 在开发EOS DApp智能合约时,我们都知道可以使用multi_index来对合约数据的存储与查询,但合约的存储是需要消耗一定的资源的,而且随着用户的增长往往会导业务数据会越来越大,从而导致合约需要更多的资源来支撑其数据。

有时我们可以通过业务设计,让业务数据得到即时清理及资源释放。但大多数情况下,业务数据是不允许清理的,那么针对这种情况是否有其他办法来降低对合约存储资源的消耗呢?

那么,今天分享的方案就是:借用EOS链提供的history_api_action插件服务、内部合约Action调用来完成对业务数据的存储与查询。

举个🌰️:
在去中心化交易所中,往往搓合成功会产生大量的成交订单,那保存在合约数据库中肯定是不合适的,所以可以在搓合方法中通过调用内部日志方法的形式,通过交易日志来将订单数据写入区块中;然后通过EOS节点提供的查询历史action接口,查询合约日志数据并增量同步到中心化数据库。

下面,我们将通过具体的代码示例来帮助大家理解整个过程:


首先,我们新创建一个合约(dexchange.hpp/dexchange.cpp);

//dexchange.hpp
#include <eosiolib/eosio.hpp>
#include <eosiolib/print.hpp>

using namespace eosio;

CONTRACT dexchange : public contract {
public:
using contract::contract;
dexchange(eosio::name receiver, eosio::name code, datastream<const char*> ds):contract(receiver, code, ds) {}

[[eosio::action]]
void executetrade(uint64_t pair_id, uint64_t sell_order_id, uint64_t buy_order_id);

[[eosio::action]]
void log(uint64_t deal_price, uint64_t quantity, uint64_t sell_order_id, uint64_t buy_order_id);

};

EOSIO_DISPATCH(dexchange, (executetrade)(log))

//https://gist.github.com/2b68242019242bdd12f174208e39e7d2

然后,定义并实现两个方法:executetrade、log。 executetrade合约方法负责搓合业务,当搓合业务处理完之后调用log方法,通过交易信息将参数调用数据写入区块中;

//filename: dexchange.cpp

#include "dexchange.hpp"

void dexchange::executetrade(uint64_t pair_id, uint64_t sell_order_id, uint64_t buy_order_id){
uint64_t deal_price = 1200;
uint64_t quantity = 10000;

action(
permission_level{ _self, "active"_n },
_self, "log"_n,
std::make_tuple(deal_price, pair_id, sell_order_id, buy_order_id)
).send();
}

void dexchange::log(uint64_t deal_price, uint64_t quantity, uint64_t sell_order_id, uint64_t buy_order_id){
require_auth( _self );
}

//https://gist.github.com/ea6ec431a57faee3a2823cfeee406efd

从以上示例可以看出,合约log日志方法其实并不需要做任何业务逻辑处理。只需要间接被调用,便可将我们需要的业务数据通过交易的形式记录在区块中,而不会浪费我们的合约存储空间,也不需要担心资源释放的问题。

下一步、发布智能合约,并调用一次executetrade合约方法

//发布合约至hackdappexch合约帐户
> cleos set contract hackdappexch contracts/ -p hackdappexch@active

//执行合约方法
> cleos push action hackdappexch executetrade '[1,2,3]' -p hackdappexch@active

最后,通过EOS链节点提供的RPC服务,进行历史action数据查询,通过数据过滤找到我们的日志方法及参数数据。

在确保之前的操作都成功之后,我们使用curl命令查询其对应服务:

curl --request POST \
--url https://localhost:8888/v1/history/get_actions \
--header 'content-type: application/x-www-form-urlencoded; charset=UTF-8' \
--data '{"pos":-1,"offset":-10,"account_name":"hackdappexch"}'

通过此接口查询出来的数据不仅仅是log合约方法数据,可能还会存在该合约的其他方法事件,需要根据情况再过滤一次数据。

补充说明

如果你在本地曾经搭建过EOS私链的化,那么或许看到过,EOS启动时是可以配置不同插件。而其中有一个插件history_api_plugin,就是用于监听并存储合约方法的调用信息;另外启动链节点时,是可以按规划自由指定所要监听的合约帐户及方法,如: --filter-on hackdappexch::log, 该参数配置表示只监听hackdappexch合约中的log方法。

nodeos -e -p eosio -d /mnt/dev/data \
--config-dir /mnt/dev/config \
--http-validate-host=false \
--plugin eosio::producer_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_api_plugin \
--http-server-address=0.0.0.0:8888 \
--access-control-allow-origin=* \
--contracts-console \
--filter-on hackdappexch:log: \
--max-transaction-time=1000 \
--verbose-http-errors &

如以上EOS节点启动命令,就展示了启动一个EOS节点的具体参数配置。其中,--filter-on参数便是指定只监听记录hackdappexch合约的log方法调用数据。

所以,当我们要通过链节点RPC服务查询合约方法历史调用数据时,需要先确认提供RPC服务的节点是否开启了history_api_plugin插件,以及自己所要查询的合约是否在其过滤规则之中。


小结

通过本篇文章,我们学会了利用内部合约方法调用 ➕️ 链节点历史Action查询的方式实现业务数据的另一种数据存储与查询方案。


在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org


changelog

2019-03-13 zhangliang

  • 初次发稿
]]>
+ + + + 在开发EOS DApp智能合约时,我们都知道可以使用`multi\\_index\_`来对合约数据的存储与查询,但合约的存储是需要消耗一定的资源的,而且随着用户的增长往往会导业务数据会越来越大,从而导致合约需要更多的资源来支撑其数据增长。那么是否有一种更好的方式来降低某些场景的资源消耗呢?那么,今天将为你分享一种数据存储方案: 借用EOS链提供的`history_api_action\_`插件、`内部合约Action调用`来完成对业务数据的存储与查询。HackDApp愿与你分享! + + + + + + + + + + + + + + +
+ + + 使用EOS.js发布EOS智能合约 + + https://www.hackdapp.com/archives/eosdev_deploycontract_eosjs.html + 2019-03-12T10:59:46.000Z + 2021-04-07T09:31:42.556Z + + 在之前的EOS合约开发文章,你可能学会了如何通过EOS系统命令cleos set contract的方式进行智能合约的发布与升级。

但在开发过程中,可能有的同学持续在命令容器与开发IDE间频繁切换,对开发效率有一定程序的影响,那是否有一种更好的方式帮助我们在一个窗口里快速发布合约呢?

那么本文将带你了解如何通过EOS.js进行智能合约的发布


如上图所示,在进行合约发布时,需要用到eos系统合约中的两个方法:setcode、setabi。而这两个方法分别会用到智能合约编译后的两个文件: *.wasm、*.abi。

注意 : 本文示例中使用的eosjs的版本为16.0.9

首先,需要初始化EOS-SDK实例。 事先准备好初始化SDK所必需的参数:

  • chainid
    所要发布的目标EOS链chainid. 例如:正式chainid: aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906; jungle测试网chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473等等
  • httpEndpoint
    EOS链环境http接口地址。 例如: http://localhost:8888
  • keyProvider
    合约帐户私钥,主要用于交易签名。
//config.js
const Eos = require('eosjs')

const eos = Eos({
chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f",
httpEndpoint: "http://localhost:8888",
keyProvider: "5K7mtrinTFrVTduSxizUc5hjXJEtTjVTsqSHeBHes1Viep86FP5",
broadcast: true,
sign: true
})

module.exports = {
eos,
}

//https://gist.github.com/hackdapp/2522411b98b1acdadc0d842f712ca6e0

下一步,需要代码实现对合约文件夹中的.wasm及.abi文件的读取;

function getDeployableFilesFromDir(dir) {
const dirCont = fs.readdirSync(dir)
const wasmFileName = dirCont.find(filePath => filePath.match(/.*\.(wasm)$/gi))
const abiFileName = dirCont.find(filePath => filePath.match(/.*\.(abi)$/gi))
if (!wasmFileName) throw new Error(`Cannot find a ".wasm file" in ${dir}`)
if (!abiFileName) throw new Error(`Cannot find an ".abi file" in ${dir}`)
return {
wasmPath: path.join(dir, wasmFileName),
abiPath: path.join(dir, abiFileName),
}
}

//https://gist.github.com/69b29103e5cc114f4478390076d8ad39

然后,通过调用eos实例,分别执行系统合约的setcode/setabi方法,从而达到智能合约的发布;

function deployContract({ account, contractDir }) {
const { wasmPath, abiPath } = getDeployableFilesFromDir(contractDir)

const wasm = fs.readFileSync(wasmPath)
const abi = fs.readFileSync(abiPath)

const codePromise = eos.setcode(account, 0, 0, wasm)
const abiPromise = eos.setabi(account, JSON.parse(abi))
return Promise.all([codePromise, abiPromise])
}

//https://gist.github.com/69b29103e5cc114f4478390076d8ad39

最后,调用deployContract方法,测试合约发布功能。

deployContract({ account: "eosio.token", contractDir: "./contract" }).then((result) => {
console.log(`Deployment successful`, JSON.stringify(result, null , 4))
})
.catch(err => {
console.error(`Deployment failed`, err)
})

//https://gist.github.com/69b29103e5cc114f4478390076d8ad39

小结

通过本文我们学习了如何通过eos实例的setcode/setabi方法将合约编译文件快速发布到指定链环境。

另外,如果为了提高发布合约效率,我们还可以在package.json中定义发布合约的运行脚本,并配合IDE工具中的快捷键,便可达到开发效率的进一步提升。


在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

注: 有想了解愿码全思维IT工程师加速器的朋友,可以扫码加群咨询。


changelog

2019-03-12 zhangliang

  • 初次发稿
]]>
+ + + + 之前我们曾经介绍过如何使用EOS的系统命令(cleos set contract)发布智能合约,那么今天将分享另外一种方式:使用eosjs-sdk发布合约。在此基础上,可以通过配置package.json脚本以及IDE快捷链,可以快速提升DApp开发效率。HackDApp愿与你分享! + + + + + + + + + + + + +
+ + + 剖析EOS合约编译ABI文件 + + https://www.hackdapp.com/archives/eosdev_contract_abi.html + 2019-03-07T11:33:14.000Z + 2021-04-07T09:31:42.555Z + + 相信不少开发者朋友在进行EOS合约开发时,都看到发布智能合约时的ABI文件。那ABI文件到底是什么东西?在EOS公链环境中到底发挥怎么样的作用呢以及如何解读ABI文件内容呢?

那么本章节将带你了解ABI文件与智能合约间的关系以及了解并学会ABI文件的编写。

ABI, 简称(Application Binary Interface), 是一个基于JSON语言的接口描述文档,用于描述EOS合约以及如何对合约方法进行调用。如果大家曾经接触过websocket、avro、hession、thrift等这类技术的化,那么是大体逻辑是相向的。比如websocket所提供的wsdl其实也是对websocket本身对外所提供服务的接口描述。

在EOS合约,ABI文件是由开发组件eosio.cdt工具包中的eosio-cpp命令执行所生成的文件。但在实际开发时,时常会碰到一些情况无法生成ABI文件。因为在合约开发,我们往往会根据业务自定义一些数据结构,或者使用一些第三方方法,而eosio.cdt本身对所有特隆并不是支持的很完善,所以时常导致编译失败,这时就需要我们理解ABI是如何定义智能合约的,以便于我们定制化修改自己的合约描述。

ABI文件结构是由什么组成的呢?让我们先看一个示例

{
"version": "eosio::abi/1.0",
"types": [],
"structs": [],
"actions": [],
"tables": [],
"ricardian_clauses": [],
"abi_extensions": [],
"___comment" : ""
}

上面json示例展示了一个标准智能合约所应具备的完整属性定义。

数据类型(type)
在项目开发过程,有时为了便于代码的理解,我们会将一些通用数据类型或数据结构进行别名定义,用一个在业务场景中更加贴合业务的名称代替。在types数组中便是对这种情况的定义描述。

比如:

{
"new_type_name": "age",
"type": "int"
}

或者

{
"new_type_name": "name",
"type": "string" //此处user为自定义数据结构
}

对于合约内嵌类型,是不会在此展示的。诸如: uint64_t、name、asset、symbol等。下图展示了EOS合约所支持的所有内置数据类型


结构体(struct)
在业务处理逻辑中,为了方便数据的传输与调用,往往我们会对针对业务数据进行建模并以结构体的形式展现。同样,它也需要在ABI文件中进行描述。

比如: eosio.token合约中的account结构体定义

  • ABI文件定义

    {
    "name": "account",
    "base": "",
    "fields": [
    {
    "name": "balance",
    "type": "asset"
    }
    ]
    }
  • eosio.token.hpp实现

    struct account {
    asset balance;

    uint64_t primary_key()const {
    return balance.symbol.code().raw();
    }
    };

另外,需要注意的就是除了以上这种结构体定义,其实还存在一种隐性结构体,即:合约方法参数
示例:

  • eosio.token.hpp中transfer方法定义

    void transfer( name    from,
    name to,
    asset quantity,
    string memo );
  • eosin.token合约中transfer方法在ABI文件中定义

    {
    "name": "transfer",
    "base": "",
    "fields": [
    {
    "name": "from",
    "type": "name"
    },
    {
    "name": "to",
    "type": "name"
    },
    {
    "name": "quantity",
    "type": "asset"
    },
    {
    "name": "memo",
    "type": "string"
    }
    ]
    }

可以看出,隐性结构体与前面所定义显性结构体定义是并没有什么不同,只是在智能合约业务逻辑中,我们仅用到显性结构体来存储我们的业务数据进行逻辑判断。


方法(Action)
Action数组主要用于描述外部可调用的方法列表以及具体的参数列表。在智能合约中,如果需要对外公开合约方法,往往会在合约头文件中进行如下定义:

[[eosio::action]]
void transfer(name from,name to, asset quantity, string memo);

而ABI的表现形式为:

{
"name": "transfer",
"type": "transfer",
"ricardian_contract": ""
}

从上述描述可以看出,在方法的类型定义关联了前面的隐性结构体类型。虽然在此处,方法名与隐性结构体类型命名一致,但实际情况并不一定非要相同。


表定义(Table)
关于表的ABI定义,相比其他几种定义要稍复杂一些。具体JSON定义如下

{
"name": "",
"type": "",
"index_type": "",
"key_names" : [],
"key_types" : []
}

JSON中字段说明如下:

  • name
    合约初始化表时所要使用的名称
  • type
    表对应的数据结构体。也就是前面所说的显性结构体类型
  • index _type
    此类型为表主键类型
  • key _names
    索引字段列表
  • key_types
    索引字段数据类型列表。数据长度与索引字段列表长度一致。需要说明的是索引字段类型,只支持uint64_t,uint128 _t,uint256 _t,double,long double五种类型
    示例:eosio.token合约中的accounts表
  • ABI表定义

    {
    "name": "accounts",
    "type": "account",
    "index_type": "i64",
    "key_names": ["primary_key"],
    "key_types": ["uint64"]
    }
  • 表合约代码

    struct [[eosio::table]] account {
    asset balance;

    uint64_t primary_key()const { return balance.symbol.code().raw(); }
    };

从表合约代码可以看来,只需要在数据结构体代码中添加eosio-table标签就可以完成对表的定义操作。

之所以提供多索引的实现,主要还是为了应对业务场景中不同维度的数据查询,而且支持按升序或降序的遍历方式处理业务。


ricardian条款(ricardian_clauses)
该数组主要用于定义一种基于文本的合约宪法。通过其与智能合约的整合,来解决一些无法通过程序来判定的情况。

示例如下:

"ricardian_clauses": [{
"id": "Warranty",
"body": "WARRANTY. The invoker of the contract action shall uphold its Obligations under this Contract in a timely and workmanlike manner, using knowledge and recommendations for performing the services which meet generally acceptable standards set forth by EOS.IO Blockchain Block Producers.\n\n"
},{
"id": "Default",
"body": "DEFAULT. The occurrence of any of the following shall constitute a material default under this Contract: \n\n"
},{
"id": "Remedies",
"body": "REMEDIES. In addition to any and all other rights a party may have available according to law, if a party defaults by failing to substantially perform any provision, term or condition of this Contract, the other party may terminate the Contract by providing written notice to the defaulting party. This notice shall describe with sufficient detail the nature of the default. The party receiving such notice shall promptly be removed from being a Block Producer and this Contract shall be automatically terminated. \n \n"
}
]

我们可以针对智能合约或者具体的合约方法,附加上对应的文本合约描述。比如针对方法的文本合约定义:

  • ABI定义

    "actions": [{
    "name": "hi",
    "type": "hi",
    "ricardian_contract": "# CONTRACT FOR hello::hi## ACTION NAME: hi\n### Parameters### Parameters\nInput parameters:Input parameters:\n\n* `user` (string to include in the output)* `user` (string to include in the output)\n\nImplied parameters: Implied parameters: \n\n* `account_name` (name of the party invoking and signing the contract)* `account_name` (name of the party invoking and signing the contract)\n\n### Intent### Intent\nINTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.\n\n### Term### Term\nTERM. This Contract expires at the conclusion of code execution.TERM. This Contract expires at the conclusion of code execution.\n"
    }]
  • 代码及文件定义(hello.hi_rc.md)

    # CONTRACT FOR hello::hi

    ## ACTION NAME: hi

    ### Parameters
    Input parameters:

    * `user` (string to include in the output)

    Implied parameters:

    * `account_name` (name of the party invoking and signing the contract)

    ### Intent
    INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.

    ### Term
    TERM. This Contract expires at the conclusion of code execution.

ABI Extensions
该功能将允许用户进行自定义区块扩展, 包括对数据的签名、编码等。不过现在该属性暂未被应用支持。


到此,相信大家对于整个ABI文件的结构应该有了大体的认识与理解。这样大家可以在研究其他智能合约时,可以首先阅读对方的ABI文件,就可以熟悉对方的整体接口框架。


在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org


changelog
2019-03-07 zhangliang

  • 初次发稿
]]>
+ + + + 每个EOS合约开发者肯定都知道ABI文件,但却不一定都知道ABI内部属性是什么,具体作用。本文hackdapp将带你一探ABI究竟。HackDApp愿与你分享! + + + + + + + + + + + + + + +
+ + + 重塑思维:自律 VS 习惯 + + https://www.hackdapp.com/archives/rebuildbrain_habit.html + 2019-02-14T07:46:39.000Z + 2021-04-07T09:31:42.555Z + + 自律使我压抑,习惯助我成长。 自律与习惯,其实目标都是一致的,只是所产生的行动动力源是不相同的。

相信每个人都在不停的思考一个问题,“我如何才能使明天的自己比今天的自己更加优秀一些呢?”

为了让自己变得更好,我们去总结规律,改变自我认知,希望能从不断的思维升级过程中,锻造出属于自己的思维工具,培养及丰富问题症结的方案库。

为了让自己变得更好,我们需要靠意志去坚持去做一件让自己变得优秀的事情,但你发现一段时间之后,这件事不了了知,扔那儿放下了,因为这样的事在我的人生当中简直太熟悉不过了。

相反,有一些行为却长期固化下来了,比如我们的一些日常洗漱习惯,即使你中途有一段时间没去做,那你也不会放弃这件事。

当某一种行为已经成为你的习惯时,如果你有意识的去观察一下,会发现一些许规律。比如:刷牙,可能现在没有不早晚刷牙的童鞋吧。不妨想一想这个行为大家保持了多少年,到现在是否还需要各种精神动力去推着自己去做这个事吗?

明显不需要,可以说这已经是写入自己骨头里的一种惯性行为,你要是不注意都不发现它原来其实就是一个号的学习榜样。因为它太习以为常了,平常的都忘掉它的存在。

那既然刷牙可以养成习惯,那我们其他行为为啥就不能养成一种习惯呢?

首先,处于习惯性的行为执行过程并不会让你特别有心理负担;
其次,习惯中的行为并不会消耗自己稀缺的精力;
最后,行为关联及导向性。也就是习惯行为之间的联动开关。比如:洗漱的时候总能与刷牙这件事产生一定的链接,而这个链接往往就是我们通过意识去不断增强脑回路而形成的。

之所以总结这些,就是因为我身上的一件事,当时看李笑来的专栏里曾经提到一种感受,就是“不做这件事就难受”。 当时是在是无法理解这种状态,除了吃饭这件事,找不出天天不做就难受的事来,当你无法从自身找到可以参考的例子时,你总是无法理解其概念。

直到我发现身上这件事,刮胡子。对,你没看错,就是刮胡子。

为什么讲呢?因为之前总是用电动剃须刀,总是容易忘记用,时做时不做的,而且刮的也不是太干净。直到有一天看到京东做活动卖手动剃须刀,想着买来试一试,但当时也犹豫,每天早上用这个会不会特花时间啊。

但事实证明,相比电动剃须刀,手动的虽然要麻烦一些,时间也要多花费一些。但这件事我却坚持了一年,直至今日从心理感受来讲,自己并没有感觉每天要逼着自己去做这件事,而是很自觉的每天洗漱后自动进入刮胡子状态。

为什么会这样呢?因为每一次刮完胡子,对着镜子一照,感觉干净清爽,漂亮,帅气。让我从内心看到一个舒服的自己,这算不算是一种仪式感呢。

后来,我总结了一下习惯养成的一个关键因素:持续的心理反馈。反馈可以让我们感受到变化与进步,或是一种心理满足;而持续性一来可以增强行为的动力,二过可以慢慢促进脑回路的链接建立。

那么,如何建立自己的习惯养成路径呢?那就是

  1. 先制定一个你绝对认可其价值的目标;
  2. 在意识中建立诱导因子,也就是你需要在已形成的习惯之中,建立一个与新行动的触感连接;
  3. 持续反馈,每天都要总结,让自己内心见证成长,而后通过持续达到巩固行动的动力。

小结

好的习惯、应用技巧及思维方式是可以产生复利效应价值的,关键在于它不是形式上的应用,不是为技巧而技巧,一定是在我们的生活或工作实际场景中解决实际问题,并以此不断反馈价值收获,而持续的价值收益又会加强我们执行的动力,最终形成一个正向向上的良性循环♻️。

执行力其实是落实行动的第一要素,所以我们需要学会如何去补充这项能源。而最好的方式就是让自己认可这件事的价值。并且能够在做事的过程中,有深刻的反馈与心理感受,学会记录自己的心理变化。

最后,通过不断的执行与反馈,增强我们的脑回路链接。久而久之,就会成为我们的习惯。

]]>
+ + + + 本周最大的收获就是:搞清楚自律与习惯间的转换逻辑。明白靠自律去约束自己只能不断内耗意志力,相反如果通过打造系统逻辑,形成习惯便可从根本上提高效率。因为本身习惯不消耗意志力而是一种肌肉反应能力。HackDApp愿与你分享! + + + + + + + + + + + + +
+ + + C++基础语法(EOS完全开发指南) + + https://www.hackdapp.com/archives/eosdev_cplus_basic.html + 2019-01-28T10:16:50.000Z + 2021-04-07T09:31:42.554Z + + Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

/* filename: myapp.cpp
date: 2019-01-28 3:06 PM
auth: zhangliang<zhangliang@cldy.org> */

#include <iostream> //定义头文件
#include <stdlib.h>

int main()
{
using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string

string msg = "hi, my first dapp"; //定义变量

cout << msg <<endl; //打印字符串
}

//tryit: http://tpcg.io/Tulum1

以上代码便是C++最简单可运行的最小示例。基本包含了在程序结构中所必须的一些语言特性。

根据上述程序结构,我们可以大致将它拆分成五部分内容:

1. #include <iostream>

头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。

比如:通过引用<cmath>库,可以帮助我们快速使用里面的函数进行一些数学运算。

函数列表

所以,后续我们需要学会便是如何查阅C++文档库,不断积累与完善对于第三方标准库的方法学习与理解。

2. int main()

main函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。

#include <iostream>
#include <stdlib.h>

using namespace std;

string sayHi(string username)
{
return string("hi, ").append(username).append("!");
}

int main()
{
cout << sayHi("www.hackdapp.com") << endl;
}
//tryit: http://tpcg.io/uHUkzy

函数定义,其实对于所有编程语言的定义方式大致相同, 都可以表现为以下形式

<返回类型|void> 方法名(参数定义1, 参数定义2,参数定义...)
{
//do some stuff
return <返回数据>
}

如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。

注: 在后续的第二部分,我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。

3. string message = "hi, my first app"

变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。

而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。
我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。

尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。

换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。

另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。

4. cout << msg <<endl

coutiostream函数库中的一个流数据输出函数,一般用于在程序调用过程向控制台输入一些调试信息;与此对应的是cin, 用于接收输入数据流。

不过, 在EOS合约中无法调用此函数。举而代之的是,EOSLIB库自己封装的print函数.

5. //单行注解 or /*多行注解*/

在程序开发过程,往往需要通过语言描述某个代码文件所要实现的整体功能或者某个函数的功能、参数及约束说明。这时候就需要用到注解。

而注解同样也所有的编程语言中也大致相同,一般分为单行注释与多行注释。

单行注释适用于短小的描述某一行运行逻辑;而多行注释多用于描述函数说明以及文件功能说明。


注: 在教程中如出现不易理解或存在错误的问题🐛,欢迎评论留言!

]]>
+ + + + <p><code>Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org</code></p> +<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">/* filename: myapp.cpp</span></span><br><span class="line"><span class="comment"> date: 2019-01-28 3:06 PM</span></span><br><span class="line"><span class="comment"> auth: zhangliang&lt;zhangliang@cldy.org&gt; */</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt; //定义头文件</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>; <span class="comment">//命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">string</span> msg = <span class="string">"hi, my first dapp"</span>; <span class="comment">//定义变量</span></span><br><span class="line"></span><br><span class="line"> <span class="built_in">cout</span> &lt;&lt; msg &lt;&lt;<span class="built_in">endl</span>; <span class="comment">//打印字符串</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//tryit: http://tpcg.io/Tulum1</span></span><br></pre></td></tr></table></figure> +<p>以上代码便是C++最简单可运行的最小示例。基本包含了在程序结构中所必须的一些语言特性。</p> +<p>根据上述程序结构,我们可以大致将它拆分成五部分内容:</p> + + + + + + + + + + + + +
+ + + C++导读(EOS完全开发指南) + + https://www.hackdapp.com/archives/eosdev_cplus_intro.html + 2019-01-28T10:08:35.000Z + 2021-04-07T09:31:42.555Z + + Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

本章节内容主要是带大家了解C++整个编程语言的体系架构,对C++编程语言有个整体的大致的认识与理解。另外,也是帮助大家在开发EOS智能合约之前做一下前期预习,易于对后面EOS合约的快速上手。

另外,需要说明的是,因为本身EOS智能合约是在一个沙箱机制中运行,所以它对一些标准函数库的方法进行了一些限制。所以可能导致大家可能在网上找的资料中的方法无法在合约中正常执行。

另一个角度讲,正是由于这种限制,也是减小了我们的学习范围,这样我们就不需要完全掌握的整个C++的语言体系,便可以开发智能合约。比如:文件操作读取,时间函数,随机数,这些在EOS合约里是都不可用的。 不过,有一个问题就是你无法明确知道哪些功能被禁用了,只能去试。或者官网有说明,可能我没有看到而已。

在整个开发过程,你只需要学会使用一些基础语法,简单数据类型、数据结构以及常用的一些工具库。比如:如何处理字符串,如何存储或操作数据结构。

除此之外,再掌握一些程序设计技巧,就可以实战开发自己的DApp应用了,而本身程序设计其实是与哪种程序语言不存在直接关系的,只是让你的程序有更好的应对扩展。

通过本章节内容你可以学会:

  • 对基础数据类型以及它们的数据边界有清晰的认识;
  • 学会如何使用不同数据结构处理业务场景中的问题;
  • 学会如何定义自己的函数;
  • 学会如何面对对象的思维设计自己的合约;
  • 学会如何通过模板封装形成自己的工具库;
  • 了解一些常用的标准库文件及常用的函数工具方法;
  • 学会如何通过手册查找工具函数

本章节,将会从以下八个部分进行分类介绍:

1.1 C++基础语法
1.2 基础数据类型及变量、常量定义
1.3 结构体及函数定义
1.4 数据结构
1.5 面向对象编程
1.6 高级应用(模板定义)
1.7 标准库及库函数
1.8 资源及经验分享


注: 在教程中如出现不易理解或存在错误的问题🐛,欢迎评论留言!

]]>
+ + + + <p><code>Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org</code></p> +<p>本章节内容主要是带大家了解C++整个编程语言的体系架构,对C++编程语言有个整体的大致的认识与理解。另外,也是帮助大家在开发EOS智能合约之前做一下前期预习,易于对后面EOS合约的快速上手。</p> +<p>另外,需要说明的是,因为本身EOS智能合约是在一个沙箱机制中运行,所以它对一些标准函数库的方法进行了一些限制。所以可能导致大家可能在网上找的资料中的方法无法在合约中正常执行。</p> + + + + + + + + + + + + +
+ + + 坚持的长性 + + https://www.hackdapp.com/archives/think_habit.html + 2019-01-21T01:31:24.000Z + 2021-04-07T09:31:42.554Z + +

今天早上算是被媳妇嘲笑了一番,为啥呢?

因为之前自己有一段时间,为了背英语单词,所以早起了一个月,而如今早一天晚一天,早起完全看心情。

媳妇给出的评价就是:用劲过猛,要么及早要么极迟,完全是一种过激行为。

同时她也给出建议:只要比上班的时间多出一小时其实就可以做很多事情。重要的是常态化。


2019开始了,自己确没开始。以前都早早给自己作出各种规划,对比现在,还不如之前的自己吗?不应该是每年比前一年好一些吗或者每天比昨天好一些吗?

哦,也可能是最近超忙,导致各种规划的推迟。但内心同时又会想起另外一种声音:不,你不是,你只是懒。事情没把你逼到一种绝境上,你是不会立即行动的。

2019要做的事

  1. 早起,不早起怎么做重要的事;而且希望能找到一些习惯思维方式;
  2. 持续写作,写一本自己的技术书籍,打造自己的硬核;
  3. 持续总结,不犯过去犯的错,少走弯路;
  4. 思考习惯养成路径,以便培养自己新习惯的有效成功率

注:事情不在多,夯实好这几点。

目前的状态

  • 时不时早起起来做一些事情,可能是工作上的,也可能是生活上的,但缺少对书的阅读;另外,感觉早上精力特别出奇的好,是否应该做一些最重要的事情,而读书的化放在晚上的时候。
  • 未达到持续写东西的地步,需要检讨;可能存在的原因: 对于第二天早上要写的东西,前一天没有大致规划;或者说并不需要规划,每天早上写的时候就按之前的套路写就可以了,不讲究一次写完写完美,而是持续写出自己的每个内容点,草稿结束后再修改,也是告诉自己好文章是持续修改出来的,不可能写完就扔那儿了,而是要持续完善。包括今天写的这篇,其实也是由之前早上写的卡片扩展而来的。
  • 总结之前过于重视形式化。总结对于我来讲,总感觉认可但又未给予足够的重视,因为总是断断续续的写一些自检清单。可能这个和习惯的养成也是一样,归根到底是没有成长的即视感,也就是没有反馈。比如:刮胡子,为什么要举这个例子呢?因为之前用电动剃须刀时,总是时不时刮一次;而用手动刮胡刀后,发现自己几乎每天都会坚持这件事。当时再想为什么这件事能坚持的如此之前呢?那其他事情怎么不能坚持下去呢?我是否能够从刮胡子这件事情中找到自己内心的那一份认识与感受呢。后来才发现,那是因为刮胡子这件事能让我内心出现一份好形象不邋遢的意识。洗漱的时候就是在潜意识里调动这份动力,而且在刮完胡子后更加让自己内心得以满足,这不正是一种仪式感吗?
  • 正在有意识,感受自己每天坚持做一件事情的内心是如何的?

所以,如果要让某个行为成为你的习惯,你就要从内心上提高对它的认可,以及最重要的一件事,你要寻找你的内心感受,是什么让你满足。如果这个不好理解的话,我给你的建议就是观察你已有的习惯中想想那是一种什么感觉,做个比较可能会更形象一些。

]]>
+ + + + + + <p><img src="https://ws1.sinaimg.cn/large/006tNc79gy1fzdyksu0ykj30qy0dw400.jpg" alt></p> +<p>今天早上算是被媳妇嘲笑了一番,为啥呢?</p> +<p>因为之前自己有一段时间,为了背英语单词,所 + + + + + + + + + + + + + + + +
+ + + 波场Tron-可快捷开发的实战工程模板 + + https://www.hackdapp.com/archives/tron_boilerplate.html + 2019-01-11T22:42:54.000Z + 2021-04-07T09:31:42.554Z + +
 _                         _           _ _                 _       _
| |_ _ __ ___ _ __ | |__ ___ (_) | ___ _ __ _ __ | | __ _| |_ ___
| __| '__/ _ \| '_ \ _____| '_ \ / _ \| | |/ _ \ '__| '_ \| |/ _` | __/ _ \
| |_| | | (_) | | | |_____| |_) | (_) | | | __/ | | |_) | | (_| | || __/
\__|_| \___/|_| |_| |_.__/ \___/|_|_|\___|_| | .__/|_|\__,_|\__\___|
|_|

Tron-Boilerplate, 是基于Tron公链的一套可快速搭建本地私链环境、发布合约以及配置完整的标准工程模板。

该工程模板旨在于帮助大家快速工程化本地开发环境,减少环境搭建以及调试开发流程过程中所需花费的大量时间,让大家将更多精力投入到产品设计与核心业务逻辑实现上。

使用提供的工程模板,可从以下四个方面提升开发效率:

  • 一键启动或暂停私链环境
  • 一键编译智能合约
  • 一键发布智能合约
  • 一键单元测试(jtest)

同时,本工程模板附带了一个完整的示例代码(Todolist),可供大家参考与学习。示例效果如下:

最后,开发人员只需按照项目工程结构,编写自己的智能合约、前端页面及与SDK交互逻辑即可。


前置依赖

1. 安装docker

Install Docker for Mac : https://docs.docker.com/docker-for-mac/
Install Docker for Windows: https://docs.docker.com/docker-for-windows/install/

更多资料可参考: https://docs.docker.com

2. 安装node

To install or update nvm, you can use the install script using cURL:

curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

or wget

wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

The script clones the nvm repository to /.nvm and adds the source line to your profile (/.bash_profile, /.zshrc, /.profile, or /.bashrc)._

export NVM_DIR="${XDG_CONFIG_HOME/:-$HOME/.}nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

更多资料可参考: https://github.com/creationix/nvm#installation

3. 安装jdk8

JDK8: https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

如果大家不使用tron提供的tron-studio开发合约的化,可以选择不安装此项。因为使用tronbox同样也可以编译以及发布合约。

4. 安装tronbox

npm install -g tronbox

注:对于最新的 Java-Tron Odyssey 3.2 版本,最小兼容的 TronBox 版本是 TronBox 2.2.1。请确保您已安装此版本。

更多资料:https://cn.developers.tron.network/docs/%E5%85%A5%E9%97%A8

5. 开发工具

开发工具可根据自己喜好自由选择,个人比较推荐VSCode

官网链接:https://code.visualstudio.com/

工程安装与使用

1. 克隆工程

git clone git@github.com:ChainDesk/tron_boilerplate.git

工程结构介绍

# 项目地址: https://github.com/ChainDesk/tron_boilerplate
# 注:待工程稳定后,可能会考虑做成插件,可使用yeoman快速构建,欢迎大家star.
.
├── README.md
├── bin
│   ├── libs
│   │   └── TronStudio.jar//TronStudio开发工具包
│   ├── start_docker.sh//启动私链
│   ├── start_tronstudio.sh//启动TronStudio
│   └── stop_docker.sh//停止私链
├── build//合约编译生成目录
│   └── contracts
│   ├── HelloWorld.json//示例合约ABI, HelloWorld
│   ├── Migrations.json
│   └── TodoList.json //示例合约ABI, TodoList
├── contracts//合约目录,大家合约都放在这儿
│   ├── HelloWorld.sol
│   ├── Migrations.sol
│   └── TodoList.sol
├── migrations//发布合约目录
│   ├── 1_initial_migration.js
│   └── 2_deploy_contracts.js //新添加的合约需要在此文件中定义,否则无法通过tronbox deploy命令发布
├── package-lock.json
├── package.json//前端App工程及依赖包定义,以及多个服务启动命令。
├── public
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
├── src//前端React代码目录
│   ├── TodoList.js
│   ├── contracts
│   │   └── TodoList.json //合约ABI文件
│   ├── index.js
│   ├── serviceWorker.js
│   └── tronweb.js //新启动的工程,需要根据私链生成的私钥以及新发布的合约地址在此重新修改。
├── test//jtest测试目录,方便大家编写测试用例
│   └── web.test.js
├── tronbox-config.js
└── tronbox.js//发布合约所依赖的配置,此文件定义了本地、测试以及正式网络的http访问地址

12 directories, 27 files

2. 工程初始化

npm install

这一步主要用于更新前端框架react所依赖的包文件,依赖包安装成功后,会在工程目录下看到一个node_modules文件夹。

如果你的前端选型不是react的化,也可根据自己需求进行依赖包配置修改。

3. 正式开发流程

3.1 启动链环境

执行cmd+shift+p,调用vscode的命令列表,选择run task从中选择start_docker任务_


同样,如果要停止当前docker环境,只需选择stop_docker脚本即可。_

所有的执行任务配置默认只存在两个地方:

  • tron_boilerplate/.vscode/tasks.json_
  • package.json中的scripts
    大家可根据自己需要进行添加或修改,而且也可以通过IDE本身的快捷键映射对应的任务。

3.2 发布合约

运行task任务,然后从中选择npm deploy, 即可发布当前所有合约至私链环境。

合约发布成功后,会显示如下:

Using network 'development'.

Running migration: 1_initial_migration.js
Replacing Migrations...
Migrations:
(base58) TBC7CqpjBxGUt9Z9hhM4QNRFF5osvG3j6r
(hex) 410d68b1bfd19d341bd0f772fad8697432d0d771be
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Replacing TodoList...
TodoList:
(base58) TFyEw5qRRiZTJ5boLZJxZnv2hnhpBuvkjm
(hex) 4141d25df475fe0c053a9e2ed3a77faa10329185f0
Saving successful migration to network...
Saving artifacts...

3.3 修改配置参数

打开文件, tron_boilerplate/src/tronweb.js, 代码如下: _

...
const fullNode = new HttpProvider('http://127.0.0.1:8090');
const solidityNode = new HttpProvider('http://127.0.0.1:8091');
const eventServer = 'http://127.0.0.1:8092';

const privateKey = "<私钥地址>";
const contractAddr = "<合约地址>";
......

3.4 启动react服务

执行cmd+shift+p,调用vscode的命令列表,选择run task从中选择npm start即可启动前端服务。

打开浏览器,访问http://localhost:3000, 验证是否成功。


到此,整个工程的搭建及开发流程就介绍完毕,如中间出现任何问题欢迎加我个人微信咨询。

开发资料


在教程中如出现不易理解或存在错误的问题,欢迎加我微信指正!
Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

]]>
+ + + + 本教程通过以自己定制的工程模板为示例,讲解工程构建、快捷键部署私链及整体完整的开发注程,并配以操作动图帮助大家理解。hackdapp愿与你分享。 HackDApp愿与你分享! + + + + + + + + + + +
+ + + 2019MetaLife + + https://www.hackdapp.com/archives/2019metalife.html + 2019-01-07T16:28:42.000Z + 2021-04-07T09:31:42.553Z + + 新年愿意清单

  • 尝试每天500字,锻炼文字组织能力
  • 做一款自己的小众产品,用户达到100人
  • 尝试录制短视频
  • 出版一本书籍
]]>
+ + + + + + <p><strong>新年愿意清单</strong></p> +<ul> +<li>尝试每天500字,锻炼文字组织能力</li> +<li>做一款自己的小众产品,用户达到100人</li> +<li>尝试录制短视频</li> +<li>出版一本书籍</li> +</ul> + + + + + + + + +
+ +
diff --git a/baidu_verify_3oa53OCFMq.html b/baidu_verify_3oa53OCFMq.html new file mode 100644 index 00000000..58faed05 --- /dev/null +++ b/baidu_verify_3oa53OCFMq.html @@ -0,0 +1,23 @@ + | HackDApp

3oa53OCFMq
\ No newline at end of file diff --git a/baidusitemap.xml b/baidusitemap.xml new file mode 100644 index 00000000..2b2de7ff --- /dev/null +++ b/baidusitemap.xml @@ -0,0 +1,71 @@ + + + + https://www.hackdapp.com/archives/how-to-impl-nft-proj.html + 2021-06-28 + + + https://www.hackdapp.com/archives/how-to-make-goodnotes.html + 2021-06-07 + + + https://www.hackdapp.com/archives/20210428-%E5%A6%82%E4%BD%95%E6%8F%90%E9%AB%98%E9%98%B2%E7%8C%9D%E6%AD%BB%E7%9A%84%E8%83%BD%E5%8A%9B.html + 2021-04-28 + + + https://www.hackdapp.com/archives/how_to_write_ad_fast.html + 2021-04-07 + + + https://www.hackdapp.com/archives/Sun%20Feb%2028%202021%2000:00:00%20GMT+0800%20(China%20Standard%20Time).html + 2021-04-07 + + + https://www.hackdapp.com/archives/how-to-improve-return-risk-ratio.html + 2021-04-07 + + + https://www.hackdapp.com/archives/try_eoscontract_dev.html + 2021-04-07 + + + https://www.hackdapp.com/archives/simple_cpllus_code.html + 2021-04-07 + + + https://www.hackdapp.com/archives/eosdev_deploycontract_eosjs.html + 2021-04-07 + + + https://www.hackdapp.com/archives/eosdev_datastorage_historyaction.html + 2021-04-07 + + + https://www.hackdapp.com/archives/eosdev_cplus_intro.html + 2021-04-07 + + + https://www.hackdapp.com/archives/rebuildbrain_habit.html + 2021-04-07 + + + https://www.hackdapp.com/archives/eosdev_contract_abi.html + 2021-04-07 + + + https://www.hackdapp.com/archives/tron_boilerplate.html + 2021-04-07 + + + https://www.hackdapp.com/archives/think_habit.html + 2021-04-07 + + + https://www.hackdapp.com/archives/eosdev_cplus_basic.html + 2021-04-07 + + + https://www.hackdapp.com/archives/2019metalife.html + 2021-04-07 + + \ No newline at end of file diff --git "a/categories/EOS\345\256\214\345\205\250\345\274\200\345\217\221\346\214\207\345\215\227/index.html" "b/categories/EOS\345\256\214\345\205\250\345\274\200\345\217\221\346\214\207\345\215\227/index.html" new file mode 100644 index 00000000..51c1cb89 --- /dev/null +++ "b/categories/EOS\345\256\214\345\205\250\345\274\200\345\217\221\346\214\207\345\215\227/index.html" @@ -0,0 +1,13 @@ +EOS完全开发指南 | HackDApp
\ No newline at end of file diff --git a/categories/Write/index.html b/categories/Write/index.html new file mode 100644 index 00000000..f2f9a4be --- /dev/null +++ b/categories/Write/index.html @@ -0,0 +1,13 @@ +Write | HackDApp

Reading articles in Write

2021

\ No newline at end of file diff --git "a/categories/\344\273\245\345\244\252\345\235\212\350\257\276\347\250\213/index.html" "b/categories/\344\273\245\345\244\252\345\235\212\350\257\276\347\250\213/index.html" new file mode 100644 index 00000000..635c48ca --- /dev/null +++ "b/categories/\344\273\245\345\244\252\345\235\212\350\257\276\347\250\213/index.html" @@ -0,0 +1,13 @@ +以太坊课程 | HackDApp

Reading articles in 以太坊课程

2021

\ No newline at end of file diff --git "a/categories/\345\214\272\345\235\227\351\223\276\346\212\200\346\234\257/index.html" "b/categories/\345\214\272\345\235\227\351\223\276\346\212\200\346\234\257/index.html" new file mode 100644 index 00000000..de4fbeac --- /dev/null +++ "b/categories/\345\214\272\345\235\227\351\223\276\346\212\200\346\234\257/index.html" @@ -0,0 +1,13 @@ +区块链技术 | HackDApp

Reading articles in 区块链技术

2019

\ No newline at end of file diff --git "a/categories/\345\277\203\350\204\217\345\214\273\345\255\246\350\257\276/index.html" "b/categories/\345\277\203\350\204\217\345\214\273\345\255\246\350\257\276/index.html" new file mode 100644 index 00000000..ccbfc177 --- /dev/null +++ "b/categories/\345\277\203\350\204\217\345\214\273\345\255\246\350\257\276/index.html" @@ -0,0 +1,13 @@ +心脏医学课 | HackDApp

Reading articles in 心脏医学课

2021

\ No newline at end of file diff --git "a/categories/\346\200\235\347\273\264\350\256\244\347\237\245/index.html" "b/categories/\346\200\235\347\273\264\350\256\244\347\237\245/index.html" new file mode 100644 index 00000000..d3fb35c6 --- /dev/null +++ "b/categories/\346\200\235\347\273\264\350\256\244\347\237\245/index.html" @@ -0,0 +1,13 @@ +思维认知 | HackDApp

Reading articles in 思维认知

2019

\ No newline at end of file diff --git "a/categories/\346\212\225\350\265\204/index.html" "b/categories/\346\212\225\350\265\204/index.html" new file mode 100644 index 00000000..49027a11 --- /dev/null +++ "b/categories/\346\212\225\350\265\204/index.html" @@ -0,0 +1,13 @@ +投资 | HackDApp

Reading articles in 投资

2021

\ No newline at end of file diff --git "a/categories/\346\226\260\345\271\264\350\256\241\345\210\222-2019/index.html" "b/categories/\346\226\260\345\271\264\350\256\241\345\210\222-2019/index.html" new file mode 100644 index 00000000..7426c977 --- /dev/null +++ "b/categories/\346\226\260\345\271\264\350\256\241\345\210\222-2019/index.html" @@ -0,0 +1,13 @@ +新年计划(2019) | HackDApp

Reading articles in 新年计划(2019)

2019

\ No newline at end of file diff --git "a/categories/\347\237\245\350\257\206\345\215\241\347\211\207/index.html" "b/categories/\347\237\245\350\257\206\345\215\241\347\211\207/index.html" new file mode 100644 index 00000000..088e97b1 --- /dev/null +++ "b/categories/\347\237\245\350\257\206\345\215\241\347\211\207/index.html" @@ -0,0 +1,13 @@ +知识卡片 | HackDApp

Reading articles in 知识卡片

2021

\ No newline at end of file diff --git "a/categories/\350\256\244\347\237\245/index.html" "b/categories/\350\256\244\347\237\245/index.html" new file mode 100644 index 00000000..e3318432 --- /dev/null +++ "b/categories/\350\256\244\347\237\245/index.html" @@ -0,0 +1,13 @@ +认知 | HackDApp

Reading articles in 认知

2021

\ No newline at end of file diff --git a/css/default.css b/css/default.css new file mode 100644 index 00000000..123efd87 --- /dev/null +++ b/css/default.css @@ -0,0 +1,1146 @@ +.gitment-container { + font-family: sans-serif; + font-size: 14px; + line-height: 1.5; + color: #333; + word-wrap: break-word; +} + +.gitment-container * { + box-sizing: border-box; +} + +.gitment-container *:disabled { + cursor: not-allowed; +} + +.gitment-container a, +.gitment-container a:visited { + cursor: pointer; + text-decoration: none; +} + +.gitment-container a:hover { + text-decoration: underline; +} + +.gitment-container .gitment-hidden { + display: none; +} + +.gitment-container .gitment-spinner-icon { + fill: #333; + + -webkit-animation: gitment-spin 1s steps(12) infinite; + animation: gitment-spin 1s steps(12) infinite; +} + +@-webkit-keyframes gitment-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +@keyframes gitment-spin { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg) + } +} + +.gitment-root-container { + margin: 19px 0; +} + +.gitment-header-container { + margin: 19px 0; +} + +.gitment-header-like-btn, +.gitment-comment-like-btn { + cursor: pointer; +} + +.gitment-comment-like-btn { + float: right; +} + +.gitment-comment-like-btn.liked { + color: #F44336; +} + +.gitment-header-like-btn svg { + vertical-align: middle; + height: 30px; +} + +.gitment-comment-like-btn svg { + vertical-align: middle; + height: 20px; +} + +.gitment-header-like-btn.liked svg, +.gitment-comment-like-btn.liked svg { + fill: #F44336; +} + +a.gitment-header-issue-link, +a.gitment-header-issue-link:visited { + float: right; + line-height: 30px; + color: #666; +} + +a.gitment-header-issue-link:hover { + color: #666; +} + +.gitment-comments-loading, +.gitment-comments-error, +.gitment-comments-empty { + text-align: center; + margin: 50px 0; +} + +.gitment-comments-list { + list-style: none; + padding-left: 0; + margin: 0 0 38px; +} + +.gitment-comment, +.gitment-editor-container { + position: relative; + min-height: 60px; + padding-left: 60px; + margin: 19px 0; +} + +.gitment-comment-avatar, +.gitment-editor-avatar { + float: left; + margin-left: -60px; +} + +.gitment-comment-avatar, +.gitment-comment-avatar-img, +.gitment-comment-avatar, +.gitment-editor-avatar-img, +.gitment-editor-avatar svg { + width: 44px; + height: 44px; + border-radius: 3px; +} + +.gitment-editor-avatar .gitment-github-icon { + fill: #fff; + background-color: #333; +} + +.gitment-comment-main, +.gitment-editor-main { + position: relative; + border: 1px solid #CFD8DC; + border-radius: 0; +} + +.gitment-editor-main::before, +.gitment-editor-main::after, +.gitment-comment-main::before, +.gitment-comment-main::after { + position: absolute; + top: 11px; + left: -16px; + display: block; + width: 0; + height: 0; + pointer-events: none; + content: ""; + border-color: transparent; + border-style: solid solid outset; +} + +.gitment-editor-main::before, +.gitment-comment-main::before { + border-width: 8px; + border-right-color: #CFD8DC; +} + +.gitment-editor-main::after, +.gitment-comment-main::after { + margin-top: 1px; + margin-left: 2px; + border-width: 7px; + border-right-color: #fff; +} + +.gitment-comment-header { + margin: 12px 15px; + color: #666; + background-color: #fff; + border-radius: 3px; +} + +.gitment-editor-header { + padding: 0; + margin: 0; + border-bottom: 1px solid #CFD8DC; +} + +a.gitment-comment-name, +a.gitment-comment-name:visited { + font-weight: 600; + color: #666; +} + +.gitment-editor-tabs { + margin-bottom: -1px; + margin-left: -1px; +} + +.gitment-editor-tab { + display: inline-block; + padding: 11px 12px; + font-size: 14px; + line-height: 20px; + color: #666; + text-decoration: none; + background-color: transparent; + border-width: 0 1px; + border-style: solid; + border-color: transparent; + border-radius: 0; + + white-space: nowrap; + cursor: pointer; + user-select: none; + + outline: none; +} + +.gitment-editor-tab.gitment-selected { + color: #333; + background-color: #fff; + border-color: #CFD8DC; +} + +.gitment-editor-login { + float: right; + margin-top: -30px; + margin-right: 15px; +} + +a.gitment-footer-project-link, +a.gitment-footer-project-link:visited, +a.gitment-editor-login-link, +a.gitment-editor-login-link:visited { + color: #2196F3; +} + +a.gitment-editor-logout-link, +a.gitment-editor-logout-link:visited { + color: #666; +} + +a.gitment-editor-logout-link:hover { + color: #2196F3; + text-decoration: none; +} + +.gitment-comment-body { + position: relative; + margin: 12px 15px; + overflow: hidden; + border-radius: 3px; +} + +.gitment-comment-body-folded { + cursor: pointer; +} + +.gitment-comment-body-folded::before { + display: block !important; + content: ""; + position: absolute; + width: 100%; + left: 0; + top: 0; + bottom: 50px; + pointer-events: none; + background: -webkit-linear-gradient(top, rgba(255, 255, 255, 0), rgba(255, 255, 255, .9)); + background: linear-gradient(180deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, .9)); +} + +.gitment-comment-body-folded::after { + display: block !important; + content: "Click to Expand" !important; + text-align: center; + color: #666; + position: absolute; + width: 100%; + height: 50px; + line-height: 50px; + left: 0; + bottom: 0; + pointer-events: none; + background: rgba(255, 255, 255, .9); +} + +.gitment-editor-body { + margin: 0; +} + +.gitment-comment-body > *:first-child, +.gitment-editor-preview > *:first-child { + margin-top: 0 !important; +} + +.gitment-comment-body > *:last-child, +.gitment-editor-preview > *:last-child { + margin-bottom: 0 !important; +} + +.gitment-editor-body textarea { + display: block; + width: 100%; + min-height: 150px; + max-height: 500px; + padding: 16px; + resize: vertical; + + max-width: 100%; + margin: 0; + font-size: 14px; + line-height: 1.6; + + background-color: #fff; + + color: #333; + vertical-align: middle; + border: none; + border-radius: 0; + outline: none; + box-shadow: none; + + overflow: visible; +} + +.gitment-editor-body textarea:focus { + background-color: #fff; +} + +.gitment-editor-preview { + min-height: 150px; + + padding: 16px; + background-color: transparent; + + width: 100%; + font-size: 14px; + + line-height: 1.5; + word-wrap: break-word; +} + +.gitment-editor-footer { + padding: 0; + margin-top: 10px; +} + +.gitment-editor-footer::after { + display: table; + clear: both; + content: ""; +} + +a.gitment-editor-footer-tip { + display: inline-block; + padding-top: 10px; + font-size: 12px; + color: #666; +} + +a.gitment-editor-footer-tip:hover { + color: #2196F3; + text-decoration: none; +} + +.gitment-comments-pagination { + list-style: none; + text-align: right; + border-radius: 0; + margin: -19px 0 19px 0; +} + +.gitment-comments-page-item { + display: inline-block; + cursor: pointer; + border: 1px solid #CFD8DC; + margin-left: -1px; + padding: .25rem .5rem; +} + +.gitment-comments-page-item:hover { + background-color: #f5f5f5; +} + +.gitment-comments-page-item.gitment-selected { + background-color: #f5f5f5; +} + +.gitment-editor-submit, +.gitment-comments-init-btn { + color: #fff; + background-color: #00BCD4; + + position: relative; + display: inline-block; + padding: 7px 13px; + font-size: 14px; + font-weight: 600; + line-height: 20px; + white-space: nowrap; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-size: 110% 110%; + border: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.gitment-editor-submit:hover, +.gitment-comments-init-btn:hover { + background-color: #00ACC1; +} + +.gitment-comments-init-btn:disabled, +.gitment-editor-submit:disabled { + color: rgba(255,255,255,0.75); + background-color: #4DD0E1; + box-shadow: none; +} + +.gitment-editor-submit { + float: right; +} + +.gitment-footer-container { + margin-top: 30px; + margin-bottom: 20px; + text-align: right; + font-size: 12px; +} + +/* + * Markdown CSS + * Copied from https://github.com/sindresorhus/github-markdown-css + */ +.gitment-markdown { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + line-height: 1.5; + color: #333; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +.gitment-markdown .pl-c { + color: #969896; +} + +.gitment-markdown .pl-c1, +.gitment-markdown .pl-s .pl-v { + color: #0086b3; +} + +.gitment-markdown .pl-e, +.gitment-markdown .pl-en { + color: #795da3; +} + +.gitment-markdown .pl-smi, +.gitment-markdown .pl-s .pl-s1 { + color: #333; +} + +.gitment-markdown .pl-ent { + color: #63a35c; +} + +.gitment-markdown .pl-k { + color: #a71d5d; +} + +.gitment-markdown .pl-s, +.gitment-markdown .pl-pds, +.gitment-markdown .pl-s .pl-pse .pl-s1, +.gitment-markdown .pl-sr, +.gitment-markdown .pl-sr .pl-cce, +.gitment-markdown .pl-sr .pl-sre, +.gitment-markdown .pl-sr .pl-sra { + color: #183691; +} + +.gitment-markdown .pl-v, +.gitment-markdown .pl-smw { + color: #ed6a43; +} + +.gitment-markdown .pl-bu { + color: #b52a1d; +} + +.gitment-markdown .pl-ii { + color: #f8f8f8; + background-color: #b52a1d; +} + +.gitment-markdown .pl-c2 { + color: #f8f8f8; + background-color: #b52a1d; +} + +.gitment-markdown .pl-c2::before { + content: "^M"; +} + +.gitment-markdown .pl-sr .pl-cce { + font-weight: bold; + color: #63a35c; +} + +.gitment-markdown .pl-ml { + color: #693a17; +} + +.gitment-markdown .pl-mh, +.gitment-markdown .pl-mh .pl-en, +.gitment-markdown .pl-ms { + font-weight: bold; + color: #1d3e81; +} + +.gitment-markdown .pl-mq { + color: #008080; +} + +.gitment-markdown .pl-mi { + font-style: italic; + color: #333; +} + +.gitment-markdown .pl-mb { + font-weight: bold; + color: #333; +} + +.gitment-markdown .pl-md { + color: #bd2c00; + background-color: #ffecec; +} + +.gitment-markdown .pl-mi1 { + color: #55a532; + background-color: #eaffea; +} + +.gitment-markdown .pl-mc { + color: #ef9700; + background-color: #ffe3b4; +} + +.gitment-markdown .pl-mi2 { + color: #d8d8d8; + background-color: #808080; +} + +.gitment-markdown .pl-mdr { + font-weight: bold; + color: #795da3; +} + +.gitment-markdown .pl-mo { + color: #1d3e81; +} + +.gitment-markdown .pl-ba { + color: #595e62; +} + +.gitment-markdown .pl-sg { + color: #c0c0c0; +} + +.gitment-markdown .pl-corl { + text-decoration: underline; + color: #183691; +} + +.gitment-markdown .octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} + +.gitment-markdown a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +.gitment-markdown a:active, +.gitment-markdown a:hover { + outline-width: 0; +} + +.gitment-markdown strong { + font-weight: inherit; +} + +.gitment-markdown strong { + font-weight: bolder; +} + +.gitment-markdown h1 { + font-size: 2em; + margin: 0.67em 0; +} + +.gitment-markdown img { + border-style: none; +} + +.gitment-markdown svg:not(:root) { + overflow: hidden; +} + +.gitment-markdown code, +.gitment-markdown kbd, +.gitment-markdown pre { + font-family: monospace, monospace; + font-size: 1em; +} + +.gitment-markdown hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +.gitment-markdown input { + font: inherit; + margin: 0; +} + +.gitment-markdown input { + overflow: visible; +} + +.gitment-markdown [type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +.gitment-markdown * { + box-sizing: border-box; +} + +.gitment-markdown input { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.gitment-markdown a { + color: #0366d6; + text-decoration: none; +} + +.gitment-markdown a:hover { + text-decoration: underline; +} + +.gitment-markdown strong { + font-weight: 600; +} + +.gitment-markdown hr { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid #dfe2e5; +} + +.gitment-markdown hr::before { + display: table; + content: ""; +} + +.gitment-markdown hr::after { + display: table; + clear: both; + content: ""; +} + +.gitment-markdown table { + border-spacing: 0; + border-collapse: collapse; +} + +.gitment-markdown td, +.gitment-markdown th { + padding: 0; +} + +.gitment-markdown h1, +.gitment-markdown h2, +.gitment-markdown h3, +.gitment-markdown h4, +.gitment-markdown h5, +.gitment-markdown h6 { + margin-top: 0; + margin-bottom: 0; +} + +.gitment-markdown h1 { + font-size: 32px; + font-weight: 600; +} + +.gitment-markdown h2 { + font-size: 24px; + font-weight: 600; +} + +.gitment-markdown h3 { + font-size: 20px; + font-weight: 600; +} + +.gitment-markdown h4 { + font-size: 16px; + font-weight: 600; +} + +.gitment-markdown h5 { + font-size: 14px; + font-weight: 600; +} + +.gitment-markdown h6 { + font-size: 12px; + font-weight: 600; +} + +.gitment-markdown p { + margin-top: 0; + margin-bottom: 10px; +} + +.gitment-markdown blockquote { + margin: 0; +} + +.gitment-markdown ul, +.gitment-markdown ol { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +.gitment-markdown ol ol, +.gitment-markdown ul ol { + list-style-type: lower-roman; +} + +.gitment-markdown ul ul ol, +.gitment-markdown ul ol ol, +.gitment-markdown ol ul ol, +.gitment-markdown ol ol ol { + list-style-type: lower-alpha; +} + +.gitment-markdown dd { + margin-left: 0; +} + +.gitment-markdown code { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; +} + +.gitment-markdown pre { + margin-top: 0; + margin-bottom: 0; + font: 12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; +} + +.gitment-markdown .octicon { + vertical-align: text-bottom; +} + +.gitment-markdown .pl-0 { + padding-left: 0 !important; +} + +.gitment-markdown .pl-1 { + padding-left: 4px !important; +} + +.gitment-markdown .pl-2 { + padding-left: 8px !important; +} + +.gitment-markdown .pl-3 { + padding-left: 16px !important; +} + +.gitment-markdown .pl-4 { + padding-left: 24px !important; +} + +.gitment-markdown .pl-5 { + padding-left: 32px !important; +} + +.gitment-markdown .pl-6 { + padding-left: 40px !important; +} + +.gitment-markdown::before { + display: table; + content: ""; +} + +.gitment-markdown::after { + display: table; + clear: both; + content: ""; +} + +.gitment-markdown>*:first-child { + margin-top: 0 !important; +} + +.gitment-markdown>*:last-child { + margin-bottom: 0 !important; +} + +.gitment-markdown a:not([href]) { + color: inherit; + text-decoration: none; +} + +.gitment-markdown .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.gitment-markdown .anchor:focus { + outline: none; +} + +.gitment-markdown p, +.gitment-markdown blockquote, +.gitment-markdown ul, +.gitment-markdown ol, +.gitment-markdown dl, +.gitment-markdown table, +.gitment-markdown pre { + margin-top: 0; + margin-bottom: 16px; +} + +.gitment-markdown hr { + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: #e1e4e8; + border: 0; +} + +.gitment-markdown blockquote { + padding: 0 1em; + color: #6a737d; + border-left: 0.25em solid #dfe2e5; +} + +.gitment-markdown blockquote>:first-child { + margin-top: 0; +} + +.gitment-markdown blockquote>:last-child { + margin-bottom: 0; +} + +.gitment-markdown kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #c6cbd1; + border-bottom-color: #959da5; + border-radius: 0; + box-shadow: inset 0 -1px 0 #959da5; +} + +.gitment-markdown h1, +.gitment-markdown h2, +.gitment-markdown h3, +.gitment-markdown h4, +.gitment-markdown h5, +.gitment-markdown h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} + +.gitment-markdown h1 .octicon-link, +.gitment-markdown h2 .octicon-link, +.gitment-markdown h3 .octicon-link, +.gitment-markdown h4 .octicon-link, +.gitment-markdown h5 .octicon-link, +.gitment-markdown h6 .octicon-link { + color: #1b1f23; + vertical-align: middle; + visibility: hidden; +} + +.gitment-markdown h1:hover .anchor, +.gitment-markdown h2:hover .anchor, +.gitment-markdown h3:hover .anchor, +.gitment-markdown h4:hover .anchor, +.gitment-markdown h5:hover .anchor, +.gitment-markdown h6:hover .anchor { + text-decoration: none; +} + +.gitment-markdown h1:hover .anchor .octicon-link, +.gitment-markdown h2:hover .anchor .octicon-link, +.gitment-markdown h3:hover .anchor .octicon-link, +.gitment-markdown h4:hover .anchor .octicon-link, +.gitment-markdown h5:hover .anchor .octicon-link, +.gitment-markdown h6:hover .anchor .octicon-link { + visibility: visible; +} + +.gitment-markdown h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid #eaecef; +} + +.gitment-markdown h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid #eaecef; +} + +.gitment-markdown h3 { + font-size: 1.25em; +} + +.gitment-markdown h4 { + font-size: 1em; +} + +.gitment-markdown h5 { + font-size: 0.875em; +} + +.gitment-markdown h6 { + font-size: 0.85em; + color: #6a737d; +} + +.gitment-markdown ul, +.gitment-markdown ol { + padding-left: 2em; +} + +.gitment-markdown ul ul, +.gitment-markdown ul ol, +.gitment-markdown ol ol, +.gitment-markdown ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.gitment-markdown li>p { + margin-top: 16px; +} + +.gitment-markdown li+li { + margin-top: 0.25em; +} + +.gitment-markdown dl { + padding: 0; +} + +.gitment-markdown dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: 600; +} + +.gitment-markdown dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.gitment-markdown table { + display: block; + width: 100%; + overflow: auto; +} + +.gitment-markdown table th { + font-weight: 600; +} + +.gitment-markdown table th, +.gitment-markdown table td { + padding: 6px 13px; + border: 1px solid #dfe2e5; +} + +.gitment-markdown table tr { + background-color: #fff; + border-top: 1px solid #c6cbd1; +} + +.gitment-markdown table tr:nth-child(2n) { + background-color: #f5f5f5; +} + +.gitment-markdown img { + max-width: 100%; + box-sizing: content-box; + background-color: #fff; +} + +.gitment-markdown code { + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; + margin: 0; + font-size: 85%; + background-color: rgba(27,31,35,0.05); + border-radius: 0; +} + +.gitment-markdown code::before, +.gitment-markdown code::after { + letter-spacing: -0.2em; + content: "\00a0"; +} + +.gitment-markdown pre { + word-wrap: normal; +} + +.gitment-markdown pre>code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.gitment-markdown .highlight { + margin-bottom: 16px; +} + +.gitment-markdown .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.gitment-markdown .highlight pre, +.gitment-markdown pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f5f5f5; + border-radius: 0; +} + +.gitment-markdown pre code { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.gitment-markdown pre code::before, +.gitment-markdown pre code::after { + content: normal; +} + +.gitment-markdown .full-commit .btn-outline:not(:disabled):hover { + color: #005cc5; + border-color: #005cc5; +} + +.gitment-markdown kbd { + display: inline-block; + padding: 3px 5px; + font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fcfcfc; + border: solid 1px #c6cbd1; + border-bottom-color: #959da5; + border-radius: 0; + box-shadow: inset 0 -1px 0 #959da5; +} + +.gitment-markdown :checked+.radio-label { + position: relative; + z-index: 1; + border-color: #0366d6; +} + +.gitment-markdown .task-list-item { + list-style-type: none; +} + +.gitment-markdown .task-list-item+.task-list-item { + margin-top: 3px; +} + +.gitment-markdown .task-list-item input { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; +} + +.gitment-markdown hr { + border-bottom-color: #eee; +} diff --git a/css/donate.css b/css/donate.css new file mode 100644 index 00000000..a2af08ce --- /dev/null +++ b/css/donate.css @@ -0,0 +1,273 @@ +html, html>body { + margin: 0px !important; + padding: 0px !important; + height: 100%; + width: 100%; +} +body { + font-family: "Helvetica Neue", Ubuntu, "WenQuanYi Micro Hei", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", "Wenquanyi Micro Hei", "WenQuanYi Micro Hei Mono", "WenQuanYi Zen Hei", "WenQuanYi Zen Hei", "Apple LiGothic Medium", "SimHei", "ST Heiti", "WenQuanYi Zen Hei Sharp", Arial, sans-serif; + -webkit-font-smoothing:antialiased; + line-height: 1.8em; + text-shadow: 0 0 1px rgba(255,255,255,0.1); + background: #fff; +} +img {border-width: 0px;} +a{ + color: #000; + text-decoration: none; + outline:none; + border:none; +} +.list, .list li, .list-left li { + list-style: none; + list-style-type: none; + margin: 0px; + padding: 0px; +} +.pos-f { + position: fixed; +} +.left-100 { + width: 100%; + height: 100%; +} +.blur { + -webkit-filter: blur(3px); + filter: blur(3px); +} +.tr3 { + transition: all .3s; +} +#DonateText { + position: fixed; + font-size: 12px; + width: 70px; + height: 70px; + line-height: 70px; + color: #fff; + background: #ffd886 url(../img/like.svg) no-repeat center 10px; + background-size: 20px; + border-radius: 35px; + text-align: center; + left: calc(50% - 120px); + top: calc(50% - 60px); + z-index: -1; + transform: rotatez(-15deg ); +} +#donateBox { + left: calc(50% - 150px); + top: calc(50% - 15px); + background-color: #fff; + border: 1px solid #ddd; + border-radius: 6px; + width: 299px; + height: 28px; + float: left; + z-index: 1; +} +#donateBox li { + width: 74px; + /*float: left;*/ + float: right; + text-align: center; + border-left: 1px solid #ddd; + background: no-repeat center center; + background-color: rgba(204, 217, 220,0.1); + background-size: 45px; + transition: all .3s; + cursor: pointer; + overflow: hidden; + line-height: 600px; + height: 28px; + -webkit-filter: grayscale(1); + filter: grayscale(1); + opacity: 0.5; +} +#donateBox li:hover { + background-color: rgba(204, 217, 220,0.3); + -webkit-filter: grayscale(0); + filter: grayscale(0); + opacity: 1; +} +#donateBox>li:first-child { + border-width: 0; +} +#donateBox a { + display: block; +} +#donateBox #PayPal { + background-image: url(../img/paypal.svg); +} +#donateBox>#BTC { + background-image: url(../img/bitcoin.svg); + line-height: 28px; +} +#donateBox>#BTC:hover { + overflow: visible; +} +#BTC>button { + opacity: 0; + cursor: pointer; +} +#donateBox #AliPay { + background-image: url(../img/alipay.svg); +} +#donateBox #WeChat { + background-image: url(../img/wechat.svg); +} +#QRBox { + top: 0; + left: 0; + z-index: 1; + background-color: rgba(255,255,255,0.3); + display: none; + perspective: 400px; +} +#MainBox { + cursor: pointer; + position: absolute; + text-align: center; + width: 200px; + height: 200px; + left: calc(50% - 100px); + top: calc(50% - 100px); + background: #fff no-repeat center center; + background-size: 190px; + border-radius: 6px; + box-shadow: 0px 2px 7px rgba(0,0,0,0.3); + opacity: 0; + transition: all 1s ease-in-out; + transform-style: preserve-3d; + transform-origin: center center; + overflow: hidden; +} +#btc-key { + opacity: 0; + width: 2px; + height: 8px; + overflow: hidden; + left: -2px; + top: -8px; +} +#github { + width: 24px; + height: 24px; + left: calc(50% + 135px); + top: calc(50% - 30px); + background: no-repeat center center url(../img/github.svg); + background-size: contain; + opacity: 0.3; + transform: rotatez(15deg ); +} +[data-footnote] { + position: relative; + overflow: hidden; +} +[data-footnote]:hover { + overflow: visible; +} +[data-footnote]::before, [data-footnote]::after { + position: absolute; + transition: all .3s; + transform: translate3d(-50%,0,0); + opacity: 0; + left: 37px; + z-index: 10; +} +[data-footnote]::before { + content: attr(data-footnote); + border-radius: 6px; + background-color: rgba(100,100,100,0.8); + color: #fff; + height: 24px; + line-height: 24px; + padding: 0 6px; + font-size: 12px; + white-space: nowrap; + top: -24px; + left: 37px; +} +[data-footnote]::after { + content: ''; + border: 5px solid #333; + border-color: rgba(100,100,100,0.8) transparent transparent transparent; + top: 0; + left: 37px; +} +[data-footnote]:hover::before,[data-footnote]:hover::after { + opacity: 1; +} +[data-footnote]:hover::before,[data-footnote]:hover::after { + transform: translate3d(-50%,-7px,0); +} + +#MainBox.showQR { + opacity: 1; + animation-name:showQR; + animation-duration:3s; + animation-timing-function:ease-in-out; + animation-iteration-count:1; + animation-fill-mode:forwards; + -webkit-animation:showQR 3s ease-in-out 0s 1 normal forwards; +} +@keyframes showQR { + from { + transform: rotateX(90deg); + } + 8% { + opacity: 1; + transform: rotateX(-60deg); + } + 18% { + opacity: 1; + transform: rotateX(40deg); + } + 34% { + opacity: 1; + transform: rotateX(-28deg); + } + 44% { + opacity: 1; + transform: rotateX(18deg); + } + 58% { + opacity: 1; + transform: rotateX(-12deg); + } + 72% { + opacity: 1; + transform: rotateX(9deg); + } + 88% { + opacity: 1; + transform: rotateX(-5deg); + } + 96% { + opacity: 1; + transform: rotateX(2deg); + } + to { + opacity: 1; + } +} +#MainBox.hideQR { + opacity: 1; + animation-name:hideQR; + animation-duration:0.5s; + animation-timing-function:ease-in-out; + animation-iteration-count:1; + animation-fill-mode:forwards; + -webkit-animation:hideQR 0.5s ease-in-out 0s 1 normal forwards; +} +@keyframes hideQR { + from { + } + 20%,50% { + transform: scale(1.08,1.08); + opacity: 1; + } + to { + opacity: 0; + transform: rotateZ(40deg) scale(0.6,0.6); + } +} diff --git a/css/gitalk.css b/css/gitalk.css new file mode 100644 index 00000000..3b1ef0a4 --- /dev/null +++ b/css/gitalk.css @@ -0,0 +1,1207 @@ +@font-face { + font-family: octicons-link; + src: url(data:font/woff;charset=utf-8;base64,d09GRgABAAAAAAZwABAAAAAACFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEU0lHAAAGaAAAAAgAAAAIAAAAAUdTVUIAAAZcAAAACgAAAAoAAQAAT1MvMgAAAyQAAABJAAAAYFYEU3RjbWFwAAADcAAAAEUAAACAAJThvmN2dCAAAATkAAAABAAAAAQAAAAAZnBnbQAAA7gAAACyAAABCUM+8IhnYXNwAAAGTAAAABAAAAAQABoAI2dseWYAAAFsAAABPAAAAZwcEq9taGVhZAAAAsgAAAA0AAAANgh4a91oaGVhAAADCAAAABoAAAAkCA8DRGhtdHgAAAL8AAAADAAAAAwGAACfbG9jYQAAAsAAAAAIAAAACABiATBtYXhwAAACqAAAABgAAAAgAA8ASm5hbWUAAAToAAABQgAAAlXu73sOcG9zdAAABiwAAAAeAAAAME3QpOBwcmVwAAAEbAAAAHYAAAB/aFGpk3jaTY6xa8JAGMW/O62BDi0tJLYQincXEypYIiGJjSgHniQ6umTsUEyLm5BV6NDBP8Tpts6F0v+k/0an2i+itHDw3v2+9+DBKTzsJNnWJNTgHEy4BgG3EMI9DCEDOGEXzDADU5hBKMIgNPZqoD3SilVaXZCER3/I7AtxEJLtzzuZfI+VVkprxTlXShWKb3TBecG11rwoNlmmn1P2WYcJczl32etSpKnziC7lQyWe1smVPy/Lt7Kc+0vWY/gAgIIEqAN9we0pwKXreiMasxvabDQMM4riO+qxM2ogwDGOZTXxwxDiycQIcoYFBLj5K3EIaSctAq2kTYiw+ymhce7vwM9jSqO8JyVd5RH9gyTt2+J/yUmYlIR0s04n6+7Vm1ozezUeLEaUjhaDSuXHwVRgvLJn1tQ7xiuVv/ocTRF42mNgZGBgYGbwZOBiAAFGJBIMAAizAFoAAABiAGIAznjaY2BkYGAA4in8zwXi+W2+MjCzMIDApSwvXzC97Z4Ig8N/BxYGZgcgl52BCSQKAA3jCV8CAABfAAAAAAQAAEB42mNgZGBg4f3vACQZQABIMjKgAmYAKEgBXgAAeNpjYGY6wTiBgZWBg2kmUxoDA4MPhGZMYzBi1AHygVLYQUCaawqDA4PChxhmh/8ODDEsvAwHgMKMIDnGL0x7gJQCAwMAJd4MFwAAAHjaY2BgYGaA4DAGRgYQkAHyGMF8NgYrIM3JIAGVYYDT+AEjAwuDFpBmA9KMDEwMCh9i/v8H8sH0/4dQc1iAmAkALaUKLgAAAHjaTY9LDsIgEIbtgqHUPpDi3gPoBVyRTmTddOmqTXThEXqrob2gQ1FjwpDvfwCBdmdXC5AVKFu3e5MfNFJ29KTQT48Ob9/lqYwOGZxeUelN2U2R6+cArgtCJpauW7UQBqnFkUsjAY/kOU1cP+DAgvxwn1chZDwUbd6CFimGXwzwF6tPbFIcjEl+vvmM/byA48e6tWrKArm4ZJlCbdsrxksL1AwWn/yBSJKpYbq8AXaaTb8AAHja28jAwOC00ZrBeQNDQOWO//sdBBgYGRiYWYAEELEwMTE4uzo5Zzo5b2BxdnFOcALxNjA6b2ByTswC8jYwg0VlNuoCTWAMqNzMzsoK1rEhNqByEyerg5PMJlYuVueETKcd/89uBpnpvIEVomeHLoMsAAe1Id4AAAAAAAB42oWQT07CQBTGv0JBhagk7HQzKxca2sJCE1hDt4QF+9JOS0nbaaYDCQfwCJ7Au3AHj+LO13FMmm6cl7785vven0kBjHCBhfpYuNa5Ph1c0e2Xu3jEvWG7UdPDLZ4N92nOm+EBXuAbHmIMSRMs+4aUEd4Nd3CHD8NdvOLTsA2GL8M9PODbcL+hD7C1xoaHeLJSEao0FEW14ckxC+TU8TxvsY6X0eLPmRhry2WVioLpkrbp84LLQPGI7c6sOiUzpWIWS5GzlSgUzzLBSikOPFTOXqly7rqx0Z1Q5BAIoZBSFihQYQOOBEdkCOgXTOHA07HAGjGWiIjaPZNW13/+lm6S9FT7rLHFJ6fQbkATOG1j2OFMucKJJsxIVfQORl+9Jyda6Sl1dUYhSCm1dyClfoeDve4qMYdLEbfqHf3O/AdDumsjAAB42mNgYoAAZQYjBmyAGYQZmdhL8zLdDEydARfoAqIAAAABAAMABwAKABMAB///AA8AAQAAAAAAAAAAAAAAAAABAAAAAA==) format('woff'); +} + +.markdown-body { + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + line-height: 1.5; + color: #24292e; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; +} + +.markdown-body .pl-c { + color: #6a737d; +} + +.markdown-body .pl-c1, +.markdown-body .pl-s .pl-v { + color: #005cc5; +} + +.markdown-body .pl-e, +.markdown-body .pl-en { + color: #6f42c1; +} + +.markdown-body .pl-smi, +.markdown-body .pl-s .pl-s1 { + color: #24292e; +} + +.markdown-body .pl-ent { + color: #22863a; +} + +.markdown-body .pl-k { + color: #d73a49; +} + +.markdown-body .pl-s, +.markdown-body .pl-pds, +.markdown-body .pl-s .pl-pse .pl-s1, +.markdown-body .pl-sr, +.markdown-body .pl-sr .pl-cce, +.markdown-body .pl-sr .pl-sre, +.markdown-body .pl-sr .pl-sra { + color: #032f62; +} + +.markdown-body .pl-v, +.markdown-body .pl-smw { + color: #e36209; +} + +.markdown-body .pl-bu { + color: #b31d28; +} + +.markdown-body .pl-ii { + color: #fafbfc; + background-color: #b31d28; +} + +.markdown-body .pl-c2 { + color: #fafbfc; + background-color: #d73a49; +} + +.markdown-body .pl-c2::before { + content: "^M"; +} + +.markdown-body .pl-sr .pl-cce { + font-weight: bold; + color: #22863a; +} + +.markdown-body .pl-ml { + color: #735c0f; +} + +.markdown-body .pl-mh, +.markdown-body .pl-mh .pl-en, +.markdown-body .pl-ms { + font-weight: bold; + color: #005cc5; +} + +.markdown-body .pl-mi { + font-style: italic; + color: #24292e; +} + +.markdown-body .pl-mb { + font-weight: bold; + color: #24292e; +} + +.markdown-body .pl-md { + color: #b31d28; + background-color: #ffeef0; +} + +.markdown-body .pl-mi1 { + color: #22863a; + background-color: #f0fff4; +} + +.markdown-body .pl-mc { + color: #e36209; + background-color: #ffebda; +} + +.markdown-body .pl-mi2 { + color: #f6f8fa; + background-color: #005cc5; +} + +.markdown-body .pl-mdr { + font-weight: bold; + color: #6f42c1; +} + +.markdown-body .pl-ba { + color: #586069; +} + +.markdown-body .pl-sg { + color: #959da5; +} + +.markdown-body .pl-corl { + text-decoration: underline; + color: #032f62; +} + +.markdown-body .octicon { + display: inline-block; + vertical-align: text-top; + fill: currentColor; +} + +.markdown-body a { + background-color: transparent; + -webkit-text-decoration-skip: objects; +} + +.markdown-body a:active, +.markdown-body a:hover { + outline-width: 0; +} + +.markdown-body strong { + font-weight: inherit; +} + +.markdown-body strong { + font-weight: bolder; +} + +.markdown-body h1 { + font-size: 2em; + margin: 0.67em 0; +} + +.markdown-body img { + border-style: none; +} + +.markdown-body svg:not(:root) { + overflow: hidden; +} + +.markdown-body code, +.markdown-body kbd, +.markdown-body pre { + font-family: monospace, monospace; + font-size: 1em; +} + +.markdown-body hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + height: 0; + overflow: visible; +} + +.markdown-body input { + font: inherit; + margin: 0; +} + +.markdown-body input { + overflow: visible; +} + +.markdown-body [type="checkbox"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} + +.markdown-body * { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.markdown-body input { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.markdown-body a { + color: #0366d6; + text-decoration: none; +} + +.markdown-body a:hover { + text-decoration: underline; +} + +.markdown-body strong { + font-weight: 600; +} + +.markdown-body hr { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid #dfe2e5; +} + +.markdown-body hr::before { + display: table; + content: ""; +} + +.markdown-body hr::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body table { + border-spacing: 0; + border-collapse: collapse; +} + +.markdown-body td, +.markdown-body th { + padding: 0; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body h1 { + font-size: 32px; + font-weight: 600; +} + +.markdown-body h2 { + font-size: 24px; + font-weight: 600; +} + +.markdown-body h3 { + font-size: 20px; + font-weight: 600; +} + +.markdown-body h4 { + font-size: 16px; + font-weight: 600; +} + +.markdown-body h5 { + font-size: 14px; + font-weight: 600; +} + +.markdown-body h6 { + font-size: 12px; + font-weight: 600; +} + +.markdown-body p { + margin-top: 0; + margin-bottom: 10px; +} + +.markdown-body blockquote { + margin: 0; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 0; + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body ol ol, +.markdown-body ul ol { + list-style-type: lower-roman; +} + +.markdown-body ul ul ol, +.markdown-body ul ol ol, +.markdown-body ol ul ol, +.markdown-body ol ol ol { + list-style-type: lower-alpha; +} + +.markdown-body dd { + margin-left: 0; +} + +.markdown-body code { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size: 12px; +} + +.markdown-body pre { + margin-top: 0; + margin-bottom: 0; + font: 12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; +} + +.markdown-body .octicon { + vertical-align: text-bottom; +} + +.markdown-body .pl-0 { + padding-left: 0 !important; +} + +.markdown-body .pl-1 { + padding-left: 4px !important; +} + +.markdown-body .pl-2 { + padding-left: 8px !important; +} + +.markdown-body .pl-3 { + padding-left: 16px !important; +} + +.markdown-body .pl-4 { + padding-left: 24px !important; +} + +.markdown-body .pl-5 { + padding-left: 32px !important; +} + +.markdown-body .pl-6 { + padding-left: 40px !important; +} + +.markdown-body::before { + display: table; + content: ""; +} + +.markdown-body::after { + display: table; + clear: both; + content: ""; +} + +.markdown-body>*:first-child { + margin-top: 0 !important; +} + +.markdown-body>*:last-child { + margin-bottom: 0 !important; +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration: none; +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; +} + +.markdown-body .anchor:focus { + outline: none; +} + +.markdown-body p, +.markdown-body blockquote, +.markdown-body ul, +.markdown-body ol, +.markdown-body dl, +.markdown-body table, +.markdown-body pre { + margin-top: 0; + margin-bottom: 16px; +} + +.markdown-body hr { + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: #e1e4e8; + border: 0; +} + +.markdown-body blockquote { + padding: 0 1em; + color: #6a737d; + border-left: 0.25em solid #dfe2e5; +} + +.markdown-body blockquote>:first-child { + margin-top: 0; +} + +.markdown-body blockquote>:last-child { + margin-bottom: 0; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #c6cbd1; + border-bottom-color: #959da5; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 #959da5; + box-shadow: inset 0 -1px 0 #959da5; +} + +.markdown-body h1, +.markdown-body h2, +.markdown-body h3, +.markdown-body h4, +.markdown-body h5, +.markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; +} + +.markdown-body h1 .octicon-link, +.markdown-body h2 .octicon-link, +.markdown-body h3 .octicon-link, +.markdown-body h4 .octicon-link, +.markdown-body h5 .octicon-link, +.markdown-body h6 .octicon-link { + color: #1b1f23; + vertical-align: middle; + visibility: hidden; +} + +.markdown-body h1:hover .anchor, +.markdown-body h2:hover .anchor, +.markdown-body h3:hover .anchor, +.markdown-body h4:hover .anchor, +.markdown-body h5:hover .anchor, +.markdown-body h6:hover .anchor { + text-decoration: none; +} + +.markdown-body h1:hover .anchor .octicon-link, +.markdown-body h2:hover .anchor .octicon-link, +.markdown-body h3:hover .anchor .octicon-link, +.markdown-body h4:hover .anchor .octicon-link, +.markdown-body h5:hover .anchor .octicon-link, +.markdown-body h6:hover .anchor .octicon-link { + visibility: visible; +} + +.markdown-body h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid #eaecef; +} + +.markdown-body h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid #eaecef; +} + +.markdown-body h3 { + font-size: 1.25em; +} + +.markdown-body h4 { + font-size: 1em; +} + +.markdown-body h5 { + font-size: 0.875em; +} + +.markdown-body h6 { + font-size: 0.85em; + color: #6a737d; +} + +.markdown-body ul, +.markdown-body ol { + padding-left: 2em; +} + +.markdown-body ul ul, +.markdown-body ul ol, +.markdown-body ol ol, +.markdown-body ol ul { + margin-top: 0; + margin-bottom: 0; +} + +.markdown-body li>p { + margin-top: 16px; +} + +.markdown-body li+li { + margin-top: 0.25em; +} + +.markdown-body dl { + padding: 0; +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: 600; +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom: 16px; +} + +.markdown-body table { + display: block; + width: 100%; + overflow: auto; +} + +.markdown-body table th { + font-weight: 600; +} + +.markdown-body table th, +.markdown-body table td { + padding: 6px 13px; + border: 1px solid #dfe2e5; +} + +.markdown-body table tr { + background-color: #fff; + border-top: 1px solid #c6cbd1; +} + +.markdown-body table tr:nth-child(2n) { + background-color: #f6f8fa; +} + +.markdown-body img { + max-width: 100%; + -webkit-box-sizing: content-box; + box-sizing: content-box; + background-color: #fff; +} + +.markdown-body code { + padding: 0; + padding-top: 0.2em; + padding-bottom: 0.2em; + margin: 0; + font-size: 85%; + background-color: rgba(27,31,35,0.05); + border-radius: 3px; +} + +.markdown-body code::before, +.markdown-body code::after { + letter-spacing: -0.2em; + content: "\A0"; +} + +.markdown-body pre { + word-wrap: normal; +} + +.markdown-body pre>code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; +} + +.markdown-body .highlight { + margin-bottom: 16px; +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break: normal; +} + +.markdown-body .highlight pre, +.markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f6f8fa; + border-radius: 3px; +} + +.markdown-body pre code { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; +} + +.markdown-body pre code::before, +.markdown-body pre code::after { + content: normal; +} + +.markdown-body .full-commit .btn-outline:not(:disabled):hover { + color: #005cc5; + border-color: #005cc5; +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font: 11px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #d1d5da; + border-bottom-color: #c6cbd1; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 #c6cbd1; + box-shadow: inset 0 -1px 0 #c6cbd1; +} + +.markdown-body :checked+.radio-label { + position: relative; + z-index: 1; + border-color: #0366d6; +} + +.markdown-body .task-list-item { + list-style-type: none; +} + +.markdown-body .task-list-item+.task-list-item { + margin-top: 3px; +} + +.markdown-body .task-list-item input { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; +} + +.markdown-body hr { + border-bottom-color: #eee; +} +/* variables */ +/* functions & mixins */ +/* variables - calculated */ +/* styles */ +.gt-container { + -webkit-box-sizing: border-box; + box-sizing: border-box; + font-size: 16px; +/* loader */ +/* error */ +/* initing */ +/* no int */ +/* link */ +/* meta */ +/* popup */ +/* header */ +/* comments */ +/* comment */ +} +.gt-container * { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.gt-container a { + color: #6190e8; +} +.gt-container a:hover { + color: #81a6ed; + border-color: #81a6ed; +} +.gt-container a.is--active { + color: #333; + cursor: default !important; +} +.gt-container a.is--active:hover { + color: #333; +} +.gt-container .hide { + display: none !important; +} +.gt-container .gt-svg { + display: inline-block; + width: 1em; + height: 1em; + vertical-align: sub; +} +.gt-container .gt-svg svg { + width: 100%; + height: 100%; + fill: #6190e8; +} +.gt-container .gt-ico { + display: inline-block; +} +.gt-container .gt-ico-text { + margin-left: 0.3125em; +} +.gt-container .gt-ico-github .gt-svg { + width: 100%; + height: 100%; +} +.gt-container .gt-ico-github svg { + fill: inherit; +} +.gt-container .gt-spinner { + position: relative; +} +.gt-container .gt-spinner::before { + content: ''; + -webkit-box-sizing: border-box; + box-sizing: border-box; + position: absolute; + top: 3px; + width: 0.75em; + height: 0.75em; + margin-top: -0.1875em; + margin-left: -0.375em; + border-radius: 50%; + border: 1px solid #fff; + border-top-color: #6190e8; + -webkit-animation: gt-kf-rotate 0.6s linear infinite; + animation: gt-kf-rotate 0.6s linear infinite; +} +.gt-container .gt-loader { + position: relative; + border: 1px solid #999; + -webkit-animation: ease gt-kf-rotate 1.5s infinite; + animation: ease gt-kf-rotate 1.5s infinite; + display: inline-block; + font-style: normal; + width: 1.75em; + height: 1.75em; + line-height: 1.75em; + border-radius: 50%; +} +.gt-container .gt-loader:before { + content: ''; + position: absolute; + display: block; + top: 0; + left: 50%; + margin-top: -0.1875em; + margin-left: -0.1875em; + width: 0.375em; + height: 0.375em; + background-color: #999; + border-radius: 50%; +} +.gt-container .gt-avatar { + display: inline-block; + width: 3.125em; + height: 3.125em; +} +@media (max-width: 479px) { + .gt-container .gt-avatar { + width: 2em; + height: 2em; + } +} +.gt-container .gt-avatar img { + width: 100%; + height: auto; + border-radius: 3px; +} +.gt-container .gt-avatar-github { + width: 3em; + height: 3em; +} +@media (max-width: 479px) { + .gt-container .gt-avatar-github { + width: 1.875em; + height: 1.875em; + } +} +.gt-container .gt-btn { + padding: 0.75em 1.25em; + display: inline-block; + line-height: 1; + text-decoration: none; + white-space: nowrap; + cursor: pointer; + border: 1px solid #6190e8; + border-radius: 5px; + background-color: #6190e8; + color: #fff; + outline: none; + font-size: 0.75em; +} +.gt-container .gt-btn-text { + font-weight: 400; +} +.gt-container .gt-btn-loading { + position: relative; + margin-left: 0.5em; + display: inline-block; + width: 0.75em; + height: 1em; + vertical-align: top; +} +.gt-container .gt-btn.is--disable { + cursor: not-allowed; + opacity: 0.5; +} +.gt-container .gt-btn-login { + margin-right: 0; +} +.gt-container .gt-btn-preview { + background-color: #fff; + color: #6190e8; +} +.gt-container .gt-btn-preview:hover { + background-color: #f2f2f2; + border-color: #81a6ed; +} +.gt-container .gt-btn-public:hover { + background-color: #81a6ed; + border-color: #81a6ed; +} +.gt-container .gt-error { + text-align: center; + margin: 0.625em; + color: #ff3860; +} +.gt-container .gt-initing { + padding: 1.25em 0; + text-align: center; +} +.gt-container .gt-initing-text { + margin: 0.625em auto; + font-size: 92%; +} +.gt-container .gt-no-init { + padding: 1.25em 0; + text-align: center; +} +.gt-container .gt-link { + border-bottom: 1px dotted #6190e8; +} +.gt-container .gt-link-counts, +.gt-container .gt-link-project { + text-decoration: none; +} +.gt-container .gt-meta { + margin: 1.25em 0; + padding: 1em 0; + position: relative; + border-bottom: 1px solid #e9e9e9; + font-size: 1em; + position: relative; + z-index: 10; +} +.gt-container .gt-meta:before, +.gt-container .gt-meta:after { + content: " "; + display: table; +} +.gt-container .gt-meta:after { + clear: both; +} +.gt-container .gt-counts { + margin: 0 0.625em 0 0; +} +.gt-container .gt-user { + float: right; + margin: 0; + font-size: 92%; +} +.gt-container .gt-user-pic { + width: 16px; + height: 16px; + vertical-align: top; + margin-right: 0.5em; +} +.gt-container .gt-user-inner { + display: inline-block; + cursor: pointer; +} +.gt-container .gt-user .gt-ico { + margin: 0 0 0 0.3125em; +} +.gt-container .gt-user .gt-ico svg { + fill: inherit; +} +.gt-container .gt-user .is--poping .gt-ico svg { + fill: #6190e8; +} +.gt-container .gt-version { + color: #a1a1a1; + margin-left: 0.375em; +} +.gt-container .gt-copyright { + margin: 0 0.9375em 0.5em; + border-top: 1px solid #e9e9e9; + padding-top: 0.5em; +} +.gt-container .gt-popup { + position: absolute; + right: 0; + top: 2.375em; + background: #fff; + display: inline-block; + border: 1px solid #e9e9e9; + padding: 0.625em 0; + font-size: 0.875em; + letter-spacing: 0.5px; +} +.gt-container .gt-popup .gt-action { + cursor: pointer; + display: block; + margin: 0.5em 0; + padding: 0 1.125em; + position: relative; + text-decoration: none; +} +.gt-container .gt-popup .gt-action.is--active:before { + content: ''; + width: 0.25em; + height: 0.25em; + background: #6190e8; + position: absolute; + left: 0.5em; + top: 0.4375em; +} +.gt-container .gt-header { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.gt-container .gt-header-comment { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + margin-left: 1.25em; +} +@media (max-width: 479px) { + .gt-container .gt-header-comment { + margin-left: 0.875em; + } +} +.gt-container .gt-header-textarea { + padding: 0.75em; + display: block; + -webkit-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + min-height: 5.125em; + max-height: 15em; + border-radius: 5px; + border: 1px solid rgba(0,0,0,0.1); + font-size: 0.875em; + word-wrap: break-word; + resize: vertical; + background-color: #f6f6f6; + outline: none; + -webkit-transition: all 0.25s ease; + transition: all 0.25s ease; +} +.gt-container .gt-header-textarea:hover { + background-color: #fbfbfb; +} +.gt-container .gt-header-preview { + padding: 0.75em; + border-radius: 5px; + border: 1px solid rgba(0,0,0,0.1); + background-color: #f6f6f6; +} +.gt-container .gt-header-controls { + position: relative; + margin: 0.75em 0 0; +} +.gt-container .gt-header-controls:before, +.gt-container .gt-header-controls:after { + content: " "; + display: table; +} +.gt-container .gt-header-controls:after { + clear: both; +} +@media (max-width: 479px) { + .gt-container .gt-header-controls { + margin: 0; + } +} +.gt-container .gt-header-controls-tip { + font-size: 0.875em; + color: #6190e8; + text-decoration: none; + vertical-align: sub; +} +@media (max-width: 479px) { + .gt-container .gt-header-controls-tip { + display: none; + } +} +.gt-container .gt-header-controls .gt-btn { + float: right; + margin-left: 1.25em; +} +@media (max-width: 479px) { + .gt-container .gt-header-controls .gt-btn { + float: none; + width: 100%; + margin: 0.75em 0 0; + } +} +.gt-container:after { + content: ''; + position: fixed; + bottom: 100%; + left: 0; + right: 0; + top: 0; + opacity: 0; +} +.gt-container.gt-input-focused { + position: relative; +} +.gt-container.gt-input-focused:after { + content: ''; + position: fixed; + bottom: 0%; + left: 0; + right: 0; + top: 0; + background: #000; + opacity: 0.6; + -webkit-transition: opacity 0.3s, bottom 0s; + transition: opacity 0.3s, bottom 0s; + z-index: 9999; +} +.gt-container.gt-input-focused .gt-header-comment { + z-index: 10000; +} +.gt-container .gt-comments { + padding-top: 1.25em; +} +.gt-container .gt-comments-null { + text-align: center; +} +.gt-container .gt-comments-controls { + margin: 1.25em 0; + text-align: center; +} +.gt-container .gt-comment { + position: relative; + padding: 0.625em 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} +.gt-container .gt-comment-content { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + margin-left: 1.25em; + padding: 0.75em 1em; + background-color: #f9f9f9; + overflow: auto; + -webkit-transition: all ease 0.25s; + transition: all ease 0.25s; +} +.gt-container .gt-comment-content:hover { + -webkit-box-shadow: 0 0.625em 3.75em 0 #f4f4f4; + box-shadow: 0 0.625em 3.75em 0 #f4f4f4; +} +@media (max-width: 479px) { + .gt-container .gt-comment-content { + margin-left: 0.875em; + padding: 0.625em 0.75em; + } +} +.gt-container .gt-comment-header { + margin-bottom: 0.5em; + font-size: 0.875em; + position: relative; +} +.gt-container .gt-comment-username { + font-weight: 500; + color: #6190e8; + text-decoration: none; +} +.gt-container .gt-comment-username:hover { + text-decoration: underline; +} +.gt-container .gt-comment-text { + margin-left: 0.5em; + color: #a1a1a1; +} +.gt-container .gt-comment-date { + margin-left: 0.5em; + color: #a1a1a1; +} +.gt-container .gt-comment-like, +.gt-container .gt-comment-edit, +.gt-container .gt-comment-reply { + position: absolute; + height: 1.375em; +} +.gt-container .gt-comment-like:hover, +.gt-container .gt-comment-edit:hover, +.gt-container .gt-comment-reply:hover { + cursor: pointer; +} +.gt-container .gt-comment-like { + top: 0; + right: 2em; +} +.gt-container .gt-comment-edit, +.gt-container .gt-comment-reply { + top: 0; + right: 0; +} +.gt-container .gt-comment-body { + color: #333 !important; +} +.gt-container .gt-comment-admin .gt-comment-content { + background-color: #f6f9fe; +} +@-webkit-keyframes gt-kf-rotate { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes gt-kf-rotate { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +/*# sourceMappingURL=gitalk.css.map*/ \ No newline at end of file diff --git a/css/my-gitalk.css b/css/my-gitalk.css new file mode 100644 index 00000000..d58f9ca4 --- /dev/null +++ b/css/my-gitalk.css @@ -0,0 +1,249 @@ +.gitalk-card { + margin: 1.25rem auto; +} + +.gitalk-card .card-content { + padding: 1px 20px 20px 20px; +} + +#gitalk-container .gt-no-init a { + color: #42b983; + text-decoration: underline; +} + +#gitalk-container .gt-container .gt-btn, +#gitalk-container .gt-btn-login, +#gitalk-container .gt-container .gt-header-controls .gt-btn { + border: 1px solid #4caf50; + background-color: #4caf50; + box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12); +} + +#gitalk-container .gt-container .gt-link { + color: #42b983; + text-decoration: underline; +} + +#gitalk-container .gt-container .gt-btn-preview { + color: #4caf50; + background-color: #fff !important; + box-shadow: 0 2px 2px 0 rgba(76, 175, 80, 0.14), 0 3px 1px -2px rgba(76, 175, 80, 0.2), 0 1px 5px 0 rgba(76, 175, 80, 0.12); +} + +#gitalk-container .gt-container .gt-header-textarea { + background-color: #f6f9fc; + border: 1px solid rgba(0, 0, 0, 0.05); +} + +#gitalk-container .gt-container .gt-svg svg { + fill: #42b983; +} + +#gitalk-container .gt-container .gt-header-controls-tip, +#gitalk-container .gt-container a, +#gitalk-container .gt-container .gt-comment-username { + color: #42b983; +} + +#gitalk-container .gt-container .gt-ico-text { + margin-left: 0.08rem; +} + +#gitalk-container .gt-container .gt-comment-body { + color: #34495e !important; +} + +#gitalk-container .gt-container .gt-header-preview { + border: 1px solid rgba(0, 0, 0, 0.02); + background-color: #f9f9f9; +} + +.markdown-body p { + margin: 2px 2px 10px; + font-size: 1.05rem; + line-height: 1.78rem; +} + +.markdown-body blockquote p { + text-indent: 0.2rem; +} + +.markdown-body a { + padding: 0 2px; + color: #42b983; + font-weight: 500; + text-decoration: underline; +} + +.markdown-body img { + max-width: 100%; + height: auto; + cursor: pointer; +} + +.markdown-body ol li { + list-style-type: decimal; +} + +.markdown-body ol, +ul { + display: block; + padding-left: 2em; + word-spacing: 0.05rem; +} + +.markdown-body ul li, +ol li { + display: list-item; + line-height: 1.8rem; + font-size: 1rem; +} + +.markdown-body ul li { + list-style-type: disc; +} + +.markdown-body ul ul li { + list-style-type: circle; +} + +.markdown-body table, th, td { + padding: 12px 13px; + border: 1px solid #dfe2e5; +} + +.markdown-body table, th, td { + border: 0; +} + +table tr:nth-child(2n), thead { + background-color: #fafafa; +} + +.markdown-body table th { + background-color: #f2f2f2; + min-width: 80px; +} + +.markdown-body table td { + min-width: 80px; +} + +.markdown-body h1 { + font-size: 1.85rem; + font-weight: bold; + line-height: 2.2rem; +} + +.markdown-body h2 { + font-size: 1.65rem; + font-weight: bold; + line-height: 1.9rem; +} + +.markdown-body h3 { + font-size: 1.45rem; + font-weight: bold; + line-height: 1.7rem; +} + +.markdown-body h4 { + font-size: 1.25rem; + font-weight: bold; + line-height: 1.5rem; +} + +.markdown-body h5 { + font-size: 1.1rem; + font-weight: bold; + line-height: 1.4rem; +} + +.markdown-body h6 { + font-size: 1rem; + line-height: 1.3rem; +} + +.markdown-body p { + font-size: 1rem; + line-height: 1.5rem; +} + +.markdown-body hr { + margin: 12px 0; + border: 0; + border-top: 1px solid #ccc; +} + +.markdown-body blockquote { + margin: 15px 0; + border-left: 5px solid #42b983; + padding: 1rem 0.8rem 1rem 0.8rem; + color: #666; + background-color: rgba(66, 185, 131, .1); +} + +.markdown-body pre { + padding: 1.2em; + margin: .5em 0; + background: #272822; + overflow: auto; + border-radius: 0.3em; + tab-size: 4; +} + +.markdown-body code { + padding: 1px 1px; + font-size: 0.92rem; + color: #e96900; + background-color: #f8f8f8; + border-radius: 2px; +} + +.markdown-body pre code { + padding: 0; + color: #e8eaf6; + background-color: #272822; +} + +.markdown-body pre[class*="language-"] { + padding: 1.2em; + margin: .5em 0; +} + +.markdown-body code[class*="language-"], +pre[class*="language-"] { + color: #e8eaf6; +} + +.markdown-body [type="checkbox"]:not(:checked), [type="checkbox"]:checked { + position: inherit; + margin-left: -1.3rem; + margin-right: 0.4rem; + margin-top: -1px; + vertical-align: middle; + left: unset; + visibility: visible; +} + +.markdown-body b, +strong { + font-weight: bold; +} + +.markdown-body dfn { + font-style: italic; +} + +.markdown-body small { + font-size: 85%; +} + +.markdown-body cite { + font-style: normal; +} + +.markdown-body mark { + background-color: #fcf8e3; + padding: .2em; +} \ No newline at end of file diff --git a/css/style.css b/css/style.css new file mode 100644 index 00000000..c9dd1bec --- /dev/null +++ b/css/style.css @@ -0,0 +1,1465 @@ +/** + * + * @package Maupassant + * @author cho + * @version 2.0 + * @link http://chopstack.com + */ +/* +pure css setting +When setting the primary font stack, apply it to the Pure grid units along +with `html`, `button`, `input`, `select`, and `textarea`. Pure Grids use +specific font stacks to ensure the greatest OS/browser compatibility. +*/ +html, button, input, select, textarea, +.MJXc-TeX-unknown-R, +.pure-g [class*="pure-u"] { + /* Set your content font stack here: */ + font-family: "PingFangSC-Regular", Helvetica, "Helvetica Neue", "Segoe UI", "Hiragino Sans GB", "Source Han Sans CN", "Microsoft YaHei", "STHeiti", "WenQuanYi Micro Hei", sans-serif !important; } + +body { + background-color: #FFF; + color: #444; + font-family: "TIBch", "Classic Grotesque W01", "Helvetica Neue", Arial, "Hiragino Sans GB", "STHeiti", "Microsoft YaHei", "WenQuanYi Micro Hei", SimSun, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-size: 14px; } + +.body_container { + padding: 0 60px; + max-width: 1150px; + margin: 0 auto; } + +.content_container { + padding-right: 50px; + padding-top: 20px; } + +a, button.submit { + color: #6E7173; + text-decoration: none; + -webkit-transition: all .1s ease-in; + -moz-transition: all .1s ease-in; + -o-transition: all .1s ease-in; + transition: all .1s ease-in; } + +a:hover, a:active { + color: #444; } + +a:focus { + outline: auto; } + +.clear { + clear: both; } + +div { + box-sizing: border-box; } + +#header { + padding: 58px 0 0; + text-align: left; + border-bottom: 1px solid #ddd; + position: relative; } + #header .site-name { + margin-bottom: 40px; } + #header .site-name h1 { + padding: 0; + margin: 0; + height: 0; + overflow: hidden; } + #header .site-name #logo { + font: bold 38px/1.12 "Times New Roman", Georgia, Times, sans-serif; + color: #555; } + #header .site-name #logo span, #header .site-name #logo:hover { + color: #777; } + #header .site-name .description { + margin: .2em 0 0; + color: #999; } + #header #nav-menu { + margin: 10px 0 -1px; + padding: 0; + position: absolute; + right: 0; + bottom: 0; } + #header #nav-menu a { + display: inline-block; + padding: 3px 20px 3px; + line-height: 30px; + color: #444; + font-size: 13px; + border: 1px solid transparent; } + #header #nav-menu a:hover { + border-bottom-color: #444; } + #header #nav-menu a.current { + border: 1px solid #ddd; + border-bottom-color: #fff; } + +#sidebar { + border-left: 1px solid #ddd; + padding-left: 35px; + margin-top: 40px; + padding-bottom: 20px; + word-wrap: break-word; } + #sidebar .widget { + margin-bottom: 30px; } + #sidebar .widget .widget-title { + color: #6E7173; + line-height: 2.7; + margin-top: 0; + font-size: 16px; + border-bottom: 1px solid #ddd; + display: block; + font-weight: normal; } + #sidebar .widget .comments-title { + color: #6E7173; + line-height: 2.7; + margin-top: 0; + font-size: 16px; + border-bottom: 0px solid #ddd; + display: block; + font-weight: normal; } + #sidebar .widget .tagcloud { + margin-top: 10px; } + #sidebar .widget .tagcloud a { + line-height: 1.5; + padding: 5px; } + #sidebar .widget ul { + list-style: none; + padding: 0; } + #sidebar .widget ul li { + margin: 5px 0; + line-height: 1.5; } + #sidebar .widget .category-list-count { + padding-left: 5px; + color: #6E7173; } + #sidebar .widget .category-list-count::before { + content: "("; } + #sidebar .widget .category-list-count::after { + content: ")"; } + #sidebar .widget .search-form { + position: relative; + overflow: hidden; } + #sidebar .widget .search-form input { + background: #fff 8px 8px no-repeat url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6%2BR8AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAG11AABzoAAA%2FN0AAINkAABw6AAA7GgAADA%2BAAAQkOTsmeoAAAESSURBVHjajNCxS9VRGMbxz71E4OwgoXPQxVEpXCI47%2BZqGP0LCoJO7UVD3QZzb3SwcHB7F3Uw3Zpd%2FAPCcJKG7Dj4u%2FK7Pwp94HDg5Xyf5z1Pr9YKImKANTzFXxzjU2ae6qhXaxURr%2FAFl9hHDy%2FwEK8z89sYVEp5gh84wMvMvGiSJ%2FEV85jNzLMR1McqfmN5BEBmnmMJFSvtpH7jdJiZv7q7Z%2BZPfMdcF6rN%2FT%2F1m2LGBkd4HhFT3dcRMY2FpskxaLNpayciHrWAGeziD7b%2BVfkithuTk8bkGa4wgWFmbrSTZOYeBvjc%2BucQj%2FEe6xHx4Taq1nrnKaW8K6XUUsrHWuvNevdRRLzFGwzvDbXAB9cDAHvhedDruuxSAAAAAElFTkSuQmCC); + padding: 7px 11px 7px 28px; + line-height: 16px; + border: 1px solid #bbb; + width: 65%; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; } + +/* title for search result or tagged posts*/ +.label-title { + margin-top: 1.1em; + font-size: 20px; + font-weight: normal; + color: #888; } + +.post { + padding: 25px 0 15px; } + .post .post-title { + margin: 0; + color: #555; + text-align: left; + font: bold 25px/1.1 "ff-tisa-web-pro", Cambria, "Times New Roman", Georgia, Times, sans-serif; } + .post .post-title a { + color: #555; } + .post .post-meta { + padding: 0; + margin: 15px 0 0; + color: #6E7173; + float: left; + display: inline; + text-indent: .15em; } + .post .post-meta:before { + font-family: "FontAwesome"; + content: "\f073"; + padding-right: 0.3em; } + .post .post-meta .category:before { + font-family: "FontAwesome"; + content: "\f07c"; + padding-right: 0.3em; } + .post .post-meta #busuanzi_value_page_pv:before { + font-family: "FontAwesome"; + content: "\f024"; + padding-right: 0.3em; } + .post .ds-thread-count { + padding: 0; + margin: 15px 0 0; + color: #6E7173; + float: right; + display: inline; + text-indent: .15em; } + .post .ds-thread-count:before { + font-family: "FontAwesome"; + content: "\f0e5"; + padding-right: 0.3em; } + .post .ds-thread-count:hover { + color: #444; } + .post .disqus-comment-count { + padding: 0; + margin: 15px 0 0; + color: #6E7173; + float: right; + display: inline; + text-indent: .15em; } + .post .disqus-comment-count:before { + font-family: "FontAwesome"; + content: "\f0e5"; + padding-right: 0.3em; } + .post .disqus-comment-count:hover { + color: #444; } + .post .post-content { + clear: left; + font-size: 15px; + line-height: 1.77; + color: #444; + padding-top: 15px; + text-align: justify; + text-justify: distribute; + word-break: normal; } + .post .post-content h2 { + margin: 1.4em 0 1.1em; + border-bottom: 1px solid #eee; + overflow: hidden; } + .post .post-content h3 { + margin: 1.4em 0 1.1em; } + .post .post-content pre code { + padding: 0 2em; } + .post .post-content p { + margin: 0 0 1.234em; } + .post .post-content p code { + display: inline-block; + margin: 0 5px; + padding: 0 5px; + background: #f7f8f8; + font-family: Menlo, Consolas, monospace !important; } + .post .post-content p a { + color: #01579f; + padding-bottom: 2px; + word-break: normal; } + .post .post-content p a:hover { + text-decoration: underline; } + .post .post-content .caption { + color: #444; + display: block; + font-size: 0.9em; + margin-top: 0.1em; + position: relative; + text-align: center; } + .post .post-content hr { + margin: 2.4em auto; + border: none; + border-top: 1px solid #eee; + position: relative; } + .post .post-content img { + max-width: 100%; + padding: 0.5em 0; + margin: auto; + display: block; } + .post .post-content ul, .post .post-content ol { + border-radius: 3px; + margin: 1em 0; } + .post .post-content ul ul, .post .post-content ol ul { + margin: 0; } + .post .post-content ul code, .post .post-content ol code { + display: inline-block; + margin: 0 5px; + padding: 0px 5px; + background: #f7f8f8; + font-family: Menlo, Consolas, monospace !important; } + .post .post-content ul a, .post .post-content ol a { + color: #01579f; + padding-bottom: 2px; + word-break: normal; } + .post .post-content ul a:hover, .post .post-content ol a:hover { + text-decoration: underline; } + .post .tags { + padding-bottom: 1em; } + .post .tags a { + margin-right: .5em; } + .post .tags a:before { + font-family: "FontAwesome"; + content: "\f0c6"; + padding-right: 0.3em; } + +.page-navigator { + border-top: 1px solid #ddd; + list-style: none; + margin-top: 25px; + padding: 25px 0 0; + font-size: 14px; + text-align: center; } + .page-navigator .page-number { + display: inline-block; + margin: 0 5px 5px 0; } + .page-navigator a, .page-navigator span { + display: inline-block; + height: 25px; + line-height: 25px; + padding: 5px 9px; + border: 1px solid #DDD; + text-align: center; } + .page-navigator a:hover, .page-navigator span:hover { + background: #F8F8F8; + border-bottom-color: #D26911; } + .page-navigator a.prev, .page-navigator span.prev { + float: left; } + .page-navigator a.prev:before, .page-navigator span.prev:before { + font-family: "FontAwesome"; + content: "\f100"; + padding-right: 0.3em; } + .page-navigator a.next, .page-navigator span.next { + float: right; } + .page-navigator a.next:after, .page-navigator span.next:after { + font-family: "FontAwesome"; + content: "\f101"; + padding-left: 0.3em; } + .page-navigator .current { + background: #F8F8F8; + border-bottom-color: #D26911; } + .page-navigator .space { + border: none; + padding: 5px 5px; } + +#footer { + padding: .8em 0 3.6em; + margin-top: 1em; + line-height: 2.5; + color: #6E7173; + text-align: center; } + #footer span { + font-size: .9em; } + +/* for archive page starts*/ +.post-archive { + font-size: 15px; + line-height: 2; + padding-bottom: .8em; } + .post-archive h2 { + margin: 0; + font: bold 25px / 1.1 "ff-tisa-web-pro", Cambria, "Times New Roman", Georgia, Times, sans-serif; } + .post-archive .date { + padding-right: .7em; } + +/* for archive page ends*/ +/* middle*/ +@media print, screen and (max-width: 48em) { + .body_container { + padding: 0 30px; } + .content_container { + padding-right: 15px; } + .hidden_mid_and_down { + display: none !important; } + #sidebar { + border-left-width: 0px; } + #header .site-name { + margin-bottom: 20px; + text-align: center; } + #header #nav-menu { + position: relative; + text-align: center; } + #header #nav-menu a { + padding: 0 15px; + line-height: 27px; + height: 27px; + font-size: 13px; } } + +/* small*/ +@media print, screen and (max-width: 35.5em) { + .body_container { + padding: 0 20px; } + .content_container { + padding-right: 0; } } + +blockquote, .stressed { + -moz-box-sizing: border-box; + box-sizing: border-box; + margin: 2.5em 0; + padding: 0 0 0 50px; + color: #555; + border-left: none; } + +blockquote::before, .stressed-quote::before { + display: block; + font-family: times; + font-style: normal; + font-size: 48px; + color: #444; + font-weight: bold; + line-height: 30px; + margin-left: -50px; + position: absolute; } + +strong, b, em { + font-weight: bold; } + +pre { + margin: 2em 0; } + +.hidden1 { + display: none; } + +/* back-to-top rocket*/ +@media print, screen and (min-width: 48em) { + #rocket { + position: fixed; + right: 50px; + bottom: 50px; + display: block; + visibility: hidden; + width: 26px; + height: 48px; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAB8CAYAAAB356CJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAbdSURBVHja5NlbbBRVGAfw5VID+LAK8cEoxqTgmw8kPPhwipTGxJTDUAVBQBMNKtZboiDE2ES8pFEjGhNkkCrin3JbZo4YCqloUOoKJCDIRWyRAgW6R3dobU2bJtj6+eCMTqczs2d3Zh6Mm3xpdvc7++vMnHNmzvlSRJQqJgA8B8AC8EQx7YoBxgD4CAC54i0Ao2KDAIwCsNGDOPF6nNBLAYgTiyNDAKYDGCwA/Q7gtpIhAKMBHC+AOPF5FGiBIuLEXaVCR4uEzKIhAHcViRCAP4OuVRi0pgSIACwvFurw/ohhGJTP56m7u5vy+TwZhuEHHVKGANzmh3R3d48IH2wQwPWq0CIv5ByJN/L5vN9RzVKF3vQ29kOcULlOQZAZ8YjWq0JHI1wjAvClKnTJr+sq9joCcEoV6itxDDmRU4UoYvT8f6GeiFCXKpSLCJ1XhU5GhI6oQs0RoT2qUENESFeFlkeEXlCFZkeEqlWhWyNCtxSE7GdsPSL0AYAxgRCACQB2xzAzEAABYMIIyEYOxIQ4sR/AOC+UiRlxYvM/EID5CSFO1DjQoYShFmfFMJgwdC0FYHzCCAEYck5dZ8LQWQdCwpAe19xWKCocqAzA1YSQiwBGuwfs2yHJpwDcEBJHQtqu9s4MU0KSHy+wBF0c1NsATPabVL/ye6IBML4AVAbgik/bvUGz9zyf5HrFTY9VPm0XBkFlAH7xrN5uVYQmAuh3P0Q6M3fQje81V/LWIne+1gY9oPglTwLQai+Wby8SugnAj/Y2W7nqqnyUz2cagDb7P24DoAXshI2Nsl9XZXdXb/etintjMBswVrJxQ0H3rMG4oYEAaOA/e+rqAqC6uKHyAKg8VsjGDnqQg7Hve9tQrQeqTQpKuybOfgDpRCDParAhkZKBC5pmQ9MShWysvtg2RSOZTKYu0WqLYRhjTdMUQghqbGxMrtpimuYuIQQJIWj79u3JVFsMw3jHQYQQfhuC0asthmFUCiGG3JAQgjZv3hxftaW5uXmMEOJnLyKEoK1bt8ZXbTEMY5kfIoSgHTt2xFdtEUK0BkE7d+6Mp9piGMY9QYgQgkzTjKfaYprmJvcPn/vhOHV8+D511j5EuUWzqXPZEmpd9x59/102WrVFCPGrG7myopZkzUyS2ox/Ijf3bjq/8mkvpl5tMQzjDvfRdKx7l+TcmZR7bAH1nThGf167Rn0njlHn0gcoV1NJrWvXlFZtMQzjaTfU+eQSknMqqP+n0+R+9Z05RXJOBXUsW1xatcUwjAY3lLu/iuScCvJ7SW0GXVlUXVq1xTTN/cOghfcGH5E2w++I1Kot3vFzceP6vy++5xrlli6gXM1MOvOxXlq1RQiR946by6tXkpw7vNfJmko698qL1NzUVFq1RQgx4DdIL2z7lDqfephyD2l05dlH6ELjRj9EvdoSNiMozA7qtQlVSAjx34H6IkJdqlBXROi86oBtjwgdUYUOR4T2qEJmREhXnVTrI0IvqEJLIg7YalWoXAUKqSwXrrZIzsZIzvSfT5woCTr2zdckOftAchZcbZGcTZCc7ZacUfu+vQWhTCYzAjq9vZEkZyQ5E5KzkdUWGzlgJ9GFjetLgtrerXcgkpztl5yN80IZVwJdWvVMQcizqiAAdPHZR90QSc7+rbZIzuZ7vqTcfZXUdvp0KOR9/j78bQvlaiq9EEnOahzokM+X1P7FnlBoy5Ytw69P4yd+CEnOWlKSs9GSs0G/hI41bxQ1WNtffj4IupaSnI0P+JJyD1bT8aNHlbr24ZYWys2rCoKGnFPXGYS1N+1S6nFnPtaDEJKcnXUgBCVdfrHWF9q2bdswqGPZ4jBId6DZIUnUnm0J7Qgnd5lhCEnOKhyoTHJ2NSjx0qurQifTCytqw5CLkrPR7gH7dkhy6HaZ5OzbkLarvTPDlJDkRQWg+UG9TXI22W9S/conWUrOrisAjbVPkbft3qDZe55P8qsqmx6SsxU+bRcGQWWSs19ciX9Izm5WhG6UnPW52vY4M3fQje81V3JR1RbJ2Vr32Cl0h50kOWuVnHVIzm4vErpJcvaj5MySnKlVWyRnw7bHLF1L9WbTWm823dabTZP9V7N0bUQ7yVnp1RZL16p69k0eshHqzaapZ9/kIUvX4q22WLqW7cpMJzfUlZlOlq5l44YGrQ3VwyBrQzVZujYYNzRg6Rr1tkz8G2qZSJaukaVrA7GfOkvX6LemqdSbTdNvTVMdKPZTV2fpGl3dNIt6s2m6ummWA9XFDZXbP0zdn93pIGTpWnncUMrStYMugOz3qSSgWg9UmxSUtnSt30b67feJQClL1xpsqMH5LClomg1NSxpKWbpW736v0v6vAQCo4CbBrd8RBQAAAABJRU5ErkJggg==") no-repeat 50% 0; + opacity: 0; + -webkit-transition: visibility 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335), opacity 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335), -webkit-transform 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335); + -moz-transition: visibility 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335), opacity 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335), -moz-transform 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335); + transition: visibility 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335), opacity 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335), transform 0.6s cubic-bezier(0.6, 0.04, 0.98, 0.335); } + #rocket i { + display: block; + margin-top: 48px; + height: 14px; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAB8CAYAAAB356CJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKTWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQWaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28AAgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaOWJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHiwmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryMAgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0lYqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHiNLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYAQH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6cwR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBiewhi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1cQPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqOY4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hMWEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgohJZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSUEko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/pdLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Yb1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7OUndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsbdi97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxrPGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H08PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+Hvqa+It89viN+1n6Zfgf8nvs7+sv9j/i/4XnyFvFOBWABwQHlAb2BGoGzA2sDHwSZBKUHNQWNBbsGLww+FUIMCQ1ZH3KTb8AX8hv5YzPcZyya0RXKCJ0VWhv6MMwmTB7WEY6GzwjfEH5vpvlM6cy2CIjgR2yIuB9pGZkX+X0UKSoyqi7qUbRTdHF09yzWrORZ+2e9jvGPqYy5O9tqtnJ2Z6xqbFJsY+ybuIC4qriBeIf4RfGXEnQTJAntieTE2MQ9ieNzAudsmjOc5JpUlnRjruXcorkX5unOy553PFk1WZB8OIWYEpeyP+WDIEJQLxhP5aduTR0T8oSbhU9FvqKNolGxt7hKPJLmnVaV9jjdO31D+miGT0Z1xjMJT1IreZEZkrkj801WRNberM/ZcdktOZSclJyjUg1plrQr1zC3KLdPZisrkw3keeZtyhuTh8r35CP5c/PbFWyFTNGjtFKuUA4WTC+oK3hbGFt4uEi9SFrUM99m/ur5IwuCFny9kLBQuLCz2Lh4WfHgIr9FuxYji1MXdy4xXVK6ZHhp8NJ9y2jLspb9UOJYUlXyannc8o5Sg9KlpUMrglc0lamUycturvRauWMVYZVkVe9ql9VbVn8qF5VfrHCsqK74sEa45uJXTl/VfPV5bdra3kq3yu3rSOuk626s91m/r0q9akHV0IbwDa0b8Y3lG19tSt50oXpq9Y7NtM3KzQM1YTXtW8y2rNvyoTaj9nqdf13LVv2tq7e+2Sba1r/dd3vzDoMdFTve75TsvLUreFdrvUV99W7S7oLdjxpiG7q/5n7duEd3T8Wej3ulewf2Re/ranRvbNyvv7+yCW1SNo0eSDpw5ZuAb9qb7Zp3tXBaKg7CQeXBJ9+mfHvjUOihzsPcw83fmX+39QjrSHkr0jq/dawto22gPaG97+iMo50dXh1Hvrf/fu8x42N1xzWPV56gnSg98fnkgpPjp2Snnp1OPz3Umdx590z8mWtdUV29Z0PPnj8XdO5Mt1/3yfPe549d8Lxw9CL3Ytslt0utPa49R35w/eFIr1tv62X3y+1XPK509E3rO9Hv03/6asDVc9f41y5dn3m978bsG7duJt0cuCW69fh29u0XdwruTNxdeo94r/y+2v3qB/oP6n+0/rFlwG3g+GDAYM/DWQ/vDgmHnv6U/9OH4dJHzEfVI0YjjY+dHx8bDRq98mTOk+GnsqcTz8p+Vv9563Or59/94vtLz1j82PAL+YvPv655qfNy76uprzrHI8cfvM55PfGm/K3O233vuO+638e9H5ko/ED+UPPR+mPHp9BP9z7nfP78L/eE8/sl0p8zAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAbdSURBVHja5NlbbBRVGAfw5VID+LAK8cEoxqTgmw8kPPhwipTGxJTDUAVBQBMNKtZboiDE2ES8pFEjGhNkkCrin3JbZo4YCqloUOoKJCDIRWyRAgW6R3dobU2bJtj6+eCMTqczs2d3Zh6Mm3xpdvc7++vMnHNmzvlSRJQqJgA8B8AC8EQx7YoBxgD4CAC54i0Ao2KDAIwCsNGDOPF6nNBLAYgTiyNDAKYDGCwA/Q7gtpIhAKMBHC+AOPF5FGiBIuLEXaVCR4uEzKIhAHcViRCAP4OuVRi0pgSIACwvFurw/ohhGJTP56m7u5vy+TwZhuEHHVKGANzmh3R3d48IH2wQwPWq0CIv5ByJN/L5vN9RzVKF3vQ29kOcULlOQZAZ8YjWq0JHI1wjAvClKnTJr+sq9joCcEoV6itxDDmRU4UoYvT8f6GeiFCXKpSLCJ1XhU5GhI6oQs0RoT2qUENESFeFlkeEXlCFZkeEqlWhWyNCtxSE7GdsPSL0AYAxgRCACQB2xzAzEAABYMIIyEYOxIQ4sR/AOC+UiRlxYvM/EID5CSFO1DjQoYShFmfFMJgwdC0FYHzCCAEYck5dZ8LQWQdCwpAe19xWKCocqAzA1YSQiwBGuwfs2yHJpwDcEBJHQtqu9s4MU0KSHy+wBF0c1NsATPabVL/ye6IBML4AVAbgik/bvUGz9zyf5HrFTY9VPm0XBkFlAH7xrN5uVYQmAuh3P0Q6M3fQje81V/LWIne+1gY9oPglTwLQai+Wby8SugnAj/Y2W7nqqnyUz2cagDb7P24DoAXshI2Nsl9XZXdXb/etintjMBswVrJxQ0H3rMG4oYEAaOA/e+rqAqC6uKHyAKg8VsjGDnqQg7Hve9tQrQeqTQpKuybOfgDpRCDParAhkZKBC5pmQ9MShWysvtg2RSOZTKYu0WqLYRhjTdMUQghqbGxMrtpimuYuIQQJIWj79u3JVFsMw3jHQYQQfhuC0asthmFUCiGG3JAQgjZv3hxftaW5uXmMEOJnLyKEoK1bt8ZXbTEMY5kfIoSgHTt2xFdtEUK0BkE7d+6Mp9piGMY9QYgQgkzTjKfaYprmJvcPn/vhOHV8+D511j5EuUWzqXPZEmpd9x59/102WrVFCPGrG7myopZkzUyS2ox/Ijf3bjq/8mkvpl5tMQzjDvfRdKx7l+TcmZR7bAH1nThGf167Rn0njlHn0gcoV1NJrWvXlFZtMQzjaTfU+eQSknMqqP+n0+R+9Z05RXJOBXUsW1xatcUwjAY3lLu/iuScCvJ7SW0GXVlUXVq1xTTN/cOghfcGH5E2w++I1Kot3vFzceP6vy++5xrlli6gXM1MOvOxXlq1RQiR946by6tXkpw7vNfJmko698qL1NzUVFq1RQgx4DdIL2z7lDqfephyD2l05dlH6ELjRj9EvdoSNiMozA7qtQlVSAjx34H6IkJdqlBXROi86oBtjwgdUYUOR4T2qEJmREhXnVTrI0IvqEJLIg7YalWoXAUKqSwXrrZIzsZIzvSfT5woCTr2zdckOftAchZcbZGcTZCc7ZacUfu+vQWhTCYzAjq9vZEkZyQ5E5KzkdUWGzlgJ9GFjetLgtrerXcgkpztl5yN80IZVwJdWvVMQcizqiAAdPHZR90QSc7+rbZIzuZ7vqTcfZXUdvp0KOR9/j78bQvlaiq9EEnOahzokM+X1P7FnlBoy5Ytw69P4yd+CEnOWlKSs9GSs0G/hI41bxQ1WNtffj4IupaSnI0P+JJyD1bT8aNHlbr24ZYWys2rCoKGnFPXGYS1N+1S6nFnPtaDEJKcnXUgBCVdfrHWF9q2bdswqGPZ4jBId6DZIUnUnm0J7Qgnd5lhCEnOKhyoTHJ2NSjx0qurQifTCytqw5CLkrPR7gH7dkhy6HaZ5OzbkLarvTPDlJDkRQWg+UG9TXI22W9S/conWUrOrisAjbVPkbft3qDZe55P8qsqmx6SsxU+bRcGQWWSs19ciX9Izm5WhG6UnPW52vY4M3fQje81V3JR1RbJ2Vr32Cl0h50kOWuVnHVIzm4vErpJcvaj5MySnKlVWyRnw7bHLF1L9WbTWm823dabTZP9V7N0bUQ7yVnp1RZL16p69k0eshHqzaapZ9/kIUvX4q22WLqW7cpMJzfUlZlOlq5l44YGrQ3VwyBrQzVZujYYNzRg6Rr1tkz8G2qZSJaukaVrA7GfOkvX6LemqdSbTdNvTVMdKPZTV2fpGl3dNIt6s2m6ummWA9XFDZXbP0zdn93pIGTpWnncUMrStYMugOz3qSSgWg9UmxSUtnSt30b67feJQClL1xpsqMH5LClomg1NSxpKWbpW736v0v6vAQCo4CbBrd8RBQAAAABJRU5ErkJggg==") no-repeat 50% -48px; + opacity: .5; + -webkit-transition: -webkit-transform .2s; + -moz-transition: -moz-transform .2s; + transition: transform .2s; + -webkit-transform-origin: 50% 0; + -moz-transform-origin: 50% 0; + transform-origin: 50% 0; } + #rocket:hover { + background-position: 50% -62px; } + #rocket:hover i { + background-position: 50% 100%; + -webkit-animation: flaming .7s infinite; + -moz-animation: flaming .7s infinite; + animation: flaming .7s infinite; } + #rocket.show { + visibility: visible; + opacity: 1; } + #rocket.launch { + background-position: 50% -62px; + opacity: 0; + -webkit-transform: translateY(-500px); + -moz-transform: translateY(-500px); + -ms-transform: translateY(-500px); + transform: translateY(-500px); + pointer-events: none; } + #rocket.launch i { + background-position: 50% 100%; + -webkit-transform: scale(1.4, 3.2); + -moz-transform: scale(1.4, 3.2); + transform: scale(1.4, 3.2); } } + +/* ******************************************************* +* Process timelime, (homepage) +******************************************************* */ +#process { + padding: 80px 0; + background-color: #fff; } + +#process .col-md-2 i { + font-size: 50px; + position: relative; + top: 10px; } + +#process .timeline-centered { + position: relative; + margin-bottom: 30px; } + +#process .timeline-centered::before, #process .timeline-centered::after, +#process .timeline-centered::before, #process .timeline-centered::after { + content: " "; + display: table; } + +#process .timeline-centered::after { + clear: both; } + +#process .timeline-centered::before { + content: ''; + position: absolute; + display: block; + width: 4px; + background: #f5f5f6; + /*left: 50%;*/ + top: 50px; + bottom: 50px; + margin-left: 10px; } + +#process .timeline-centered .timeline-entry { + position: relative; + /*width: 50%; + float: right;*/ + margin-top: 5px; + margin-left: 20px; + margin-bottom: 10px; + clear: both; } + +#process .timeline-centered .timeline-entry::before, +#process .timeline-centered .timeline-entry::after { + content: " "; + display: table; } + +#process .timeline-centered .timeline-entry::after { + clear: both; } + +#process .timeline-centered .timeline-entry.begin { + margin-bottom: 0; } + +#process .timeline-centered .timeline-entry.left-aligned { + float: left; } + +#process .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner { + margin-left: 0; + margin-right: -18px; } + +#process .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-time { + left: auto; + right: -100px; + text-align: left; } + +#process span.number { + font-family: 'Georgia', serif, Helvetica, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans CN", "WenQuanYi Micro Hei", Arial, sans-serif; + font-style: italic; + font-size: 20px; + line-height: 0; + color: #E7E7E5; + position: relative; + top: -4px; } + +#process .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-icon { + float: right; } + +#process .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label { + margin-left: 0; + margin-right: 70px; } + +#process .timeline-centered .timeline-entry.left-aligned .timeline-entry-inner .timeline-label::after { + left: auto; + right: 0; + margin-left: 0; + margin-right: -9px; + -moz-transform: rotate(180deg); + -o-transform: rotate(180deg); + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); } + +.timeline-label p { + font-family: Helvetica, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans CN", "WenQuanYi Micro Hei", Arial, sans-serif; + margin-bottom: 3px; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner { + position: relative; + margin-left: -20px; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner::before, +#process .timeline-centered .timeline-entry .timeline-entry-inner::after { + content: " "; + display: table; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner::after { + clear: both; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-time { + position: absolute; + left: -100px; + text-align: right; + padding: 10px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-time > span { + display: block; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-time > span:first-child { + font-size: 15px; + font-weight: bold; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-time > span:last-child { + font-size: 12px; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon { + background: #fff; + color: #737881; + display: block; + width: 40px; + height: 40px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; + text-align: center; + border: 4px solid #F5F5F6; + line-height: 40px; + font-size: 15px; + float: left; + position: absolute; + top: 50%; + margin-top: -20px; + margin-left: -9px; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-icon.bg-primary { + background-color: #303641; + color: #fff; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-label { + position: relative; + background: #eee; + padding: 30px; + margin-left: 60px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; } + +#process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-label::after { + content: ''; + display: block; + position: absolute; + width: 0; + height: 0; + border-style: solid; + border-width: 9px 9px 9px 0; + border-color: transparent #eee transparent transparent; + left: 0; + top: 50%; + margin-top: -9px; + margin-left: -9px; } + +#process .line { + position: absolute; + display: block; + width: 4px; + background: #eee; + top: -3%; + right: -30px; + bottom: -3%; } + +#process .present, +#process .born { + font-size: 14px; + font-family: 'Georgia', serif, Helvetica, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans CN", "WenQuanYi Micro Hei", Arial, sans-serif; + font-style: italic; + color: #333; + padding: 10px; + background-color: #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; } + +#process .present::after, +#process .born::after { + left: 100%; + top: 50%; + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; + border-color: rgba(136, 183, 213, 0); + border-left-color: #eee; + border-width: 10px; + margin-top: -10px; } + +#process .present { + position: absolute; + top: -3%; + right: 0; + margin-top: -20px; + line-height: 100%; } + +#process .born { + position: absolute; + bottom: -3%; + right: 0; + margin-bottom: -20px; + line-height: 100%; } + +#process .dot_tp { + position: absolute; + top: -3%; + right: -35px; + background-color: transparent; + height: 15px; + width: 15px; + margin-top: -13px; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + border-radius: 50%; + border: 3px solid #eee; } + +#process .dot_bt { + position: absolute; + bottom: -3%; + right: -35px; + background-color: transparent; + height: 15px; + width: 15px; + margin-bottom: -13px; + -webkit-border-radius: 50%; + -moz-border-radius: 50%; + border-radius: 50%; + border: 3px solid #eee; } + +@media (max-width: 768px) { + #process .line { + right: 10px; } + #process .timeline-centered .timeline-entry .timeline-entry-inner .timeline-label { + margin-right: 30px; + margin-left: 45px; + padding: 20px; } + #process .timeline-centered .timeline-entry { + margin-right: 20px; } + #process .dot_tp, + #process .dot_bt { + right: 5px; } + #process .present, + #process .born { + right: 35px; } } + +/* read more*/ +.readmore a { + font-size: 14px; + color: #444; + margin: -10px 0; + padding: 5px 10px; + border: 1px solid #ddd; + border-radius: 5px; + float: right; } + .readmore a:after { + font-family: "FontAwesome"; + content: "\f101"; + padding-left: 0.3em; } + .readmore a:hover { + background: #F8F8F8; + border-bottom-color: #D26911; } + +/* syntax highlight*/ +figure.highlight, +.codeblock { + background: #f7f8f8; + margin: 10px 0; + line-height: 1.1em; + color: #333; + padding-top: 15px; + overflow: hidden; } + figure.highlight table, + .codeblock table { + display: block; + width: 100%; } + figure.highlight pre, + figure.highlight .gutter, + figure.highlight .code, + figure.highlight .tag, + .codeblock pre, + .codeblock .gutter, + .codeblock .code, + .codeblock .tag { + background-color: inherit; + font-family: Menlo, Consolas, monospace; + border: none; + padding: 0; + margin: 0; + cursor: text; } + figure.highlight .gutter, + figure.highlight .code, + .codeblock .gutter, + .codeblock .code { + vertical-align: top; } + figure.highlight.plain .gutter, + .codeblock.plain .gutter { + display: none; } + figure.highlight figcaption, + .codeblock figcaption { + font-size: 13px; + padding: 0 15px 20px; + margin: 0; + background: #f7f8f8; + color: #999999; } + figure.highlight figcaption a, + .codeblock figcaption a { + float: right; + color: #01579f; } + figure.highlight .gutter, + .codeblock .gutter { + background: #f7f8f8; + border-right: 1px solid #e6e6e6; + padding: 0.3em 15px; } + figure.highlight .code, + .codeblock .code { + padding: 0.3em 15px 0.3em 1em; + width: 100%; } + figure.highlight .code pre, + .codeblock .code pre { + max-width: 700px; + overflow-x: auto; + overflow-y: hidden; } + figure.highlight .line, + .codeblock .line { + height: 1.3em; + font-size: 13px; } + +.gist .line, +.gist .line-number { + font-family: Menlo, Consolas, monospace; + font-size: 1em; + margin: 0 0 5px 0; } + +.highlight .comment { + color: #969896; } + +.highlight .string { + color: #183691; } + +.highlight .keyword { + color: #a71d5d; } + +.highlight.apacheconf .code .common, +.highlight.apacheconf .code .nomarkup, +.highlight.apacheconf .code .attribute, +.highlight.apacheconf .code .variable, +.highlight.apacheconf .code .cbracket, +.highlight.apacheconf .code .keyword { + color: #0086b3; } + +.highlight.apacheconf .code .sqbracket { + color: #df5000; } + +.highlight.apacheconf .code .section, +.highlight.apacheconf .code .tag { + color: #63a35c; } + +.highlight.bash .code .shebang { + color: #969896; } + +.highlight.bash .code .literal, +.highlight.bash .code .built_in { + color: #0086b3; } + +.highlight.bash .code .variable { + color: #333; } + +.highlight.bash .code .title { + color: #795da3; } + +.highlight.coffeescript .code .title { + color: #795da3; } + +.highlight.coffeescript .code .literal, +.highlight.coffeescript .code .built_in, +.highlight.coffeescript .code .number { + color: #0086b3; } + +.highlight.coffeescript .code .reserved, +.highlight.coffeescript .code .attribute { + color: #1d3e81; } + +.highlight.coffeescript .code .subst, +.highlight.coffeescript .code .regexp, +.highlight.coffeescript .code .attribute { + color: #df5000; } + +.highlight.cpp .code .preprocessor, +.highlight.c .code .preprocessor { + color: #df5000; } + +.highlight.cpp .code .meta-keyword, +.highlight.c .code .meta-keyword { + color: #a71d5d; } + +.highlight.cpp .code .title, +.highlight.c .code .title { + color: #795da3; } + +.highlight.cpp .code .number, +.highlight.cpp .code .built_in, +.highlight.c .code .number, +.highlight.c .code .built_in { + color: #0086b3; } + +.highlight.cs .code .preprocessor, +.highlight.cs .code .preprocessor .keyword { + color: #333; } + +.highlight.cs .code .title { + color: #795da3; } + +.highlight.cs .code .number, +.highlight.cs .code .built_in { + color: #0086b3; } + +.highlight.cs .code .xmlDocTag, +.highlight.cs .code .doctag { + color: #63a35c; } + +.highlight.css .code .at_rule, +.highlight.css .code .important, +.highlight.css .code .meta { + color: #a71d5d; } + +.highlight.css .code .attribute, +.highlight.css .code .hexcolor, +.highlight.css .code .number, +.highlight.css .code .function { + color: #0086b3; } + +.highlight.css .code .attr_selector, +.highlight.css .code .value { + color: #333; } + +.highlight.css .code .id, +.highlight.css .code .class, +.highlight.css .code .pseudo, +.highlight.css .code .selector-pseudo { + color: #795da3; } + +.highlight.css .code .tag, +.highlight.css .code .selector-tag { + color: #63a35c; } + +.highlight.diff .code .chunk, +.highlight.diff .code .meta { + color: #795da3; + font-weight: bold; } + +.highlight.diff .code .addition { + color: #55a532; + background-color: #eaffea; } + +.highlight.diff .code .deletion { + color: #bd2c00; + background-color: #ffecec; } + +.highlight.http .code .attribute, +.highlight.http .code .attr { + color: #183691; } + +.highlight.http .code .literal { + color: #0086b3; } + +.highlight.http .code .request { + color: #a71d5d; } + +.highlight.ini .code .title, +.highlight.ini .code .section { + color: #795da3; } + +.highlight.ini .code .setting, +.highlight.ini .code .attr { + color: #a71d5d; } + +.highlight.ini .code .value, +.highlight.ini .code .keyword { + color: #333; } + +.highlight.java .code .title { + color: #795da3; } + +.highlight.java .code .javadoc { + color: #969896; } + +.highlight.java .code .meta, +.highlight.java .code .annotation, +.highlight.java .code .javadoctag { + color: #a71d5d; } + +.highlight.java .code .number { + color: #0086b3; } + +.highlight.java .code .params { + color: #1d3e81; } + +.highlight.js .code .built_in, +.highlight.js .code .title { + color: #795da3; } + +.highlight.js .code .javadoc { + color: #969896; } + +.highlight.js .code .tag, +.highlight.js .code .javadoctag { + color: #a71d5d; } + +.highlight.js .code .tag .title { + color: #333; } + +.highlight.js .code .regexp { + color: #df5000; } + +.highlight.js .code .literal, +.highlight.js .code .number { + color: #0086b3; } + +.highlight.json .code .attribute { + color: #183691; } + +.highlight.json .code .number, +.highlight.json .code .literal { + color: #0086b3; } + +.highlight.mak .code .constant { + color: #333; } + +.highlight.mak .code .title { + color: #795da3; } + +.highlight.mak .code .keyword, +.highlight.mak .code .meta-keyword { + color: #0086b3; } + +.highlight.md .code .value, +.highlight.md .code .link_label, +.highlight.md .code .strong, +.highlight.md .code .emphasis, +.highlight.md .code .blockquote, +.highlight.md .code .quote, +.highlight.md .code .section { + color: #183691; } + +.highlight.md .code .link_reference, +.highlight.md .code .symbol, +.highlight.md .code .code { + color: #0086b3; } + +.highlight.md .code .link_url, +.highlight.md .code .link { + text-decoration: underline; } + +.highlight.nginx .code .title, +.highlight.nginx .code .attribute { + color: #a71d5d; } + +.highlight.nginx .code .built_in, +.highlight.nginx .code .literal { + color: #0086b3; } + +.highlight.nginx .code .regexp { + color: #183691; } + +.highlight.nginx .code .variable { + color: #333; } + +.highlight.objectivec .code .preprocessor, +.highlight.objectivec .code .meta { + color: #a71d5d; } + .highlight.objectivec .code .preprocessor .title, + .highlight.objectivec .code .meta .title { + color: #df5000; } + +.highlight.objectivec .code .meta-string { + color: #183691; } + +.highlight.objectivec .code .title { + color: #795da3; } + +.highlight.objectivec .code .literal, +.highlight.objectivec .code .number, +.highlight.objectivec .code .built_in { + color: #0086b3; } + +.highlight.perl .code .sub { + color: #795da3; } + +.highlight.perl .code .title { + color: #795da3; } + +.highlight.perl .code .regexp { + color: #df5000; } + +.highlight.php .code .phpdoc, +.highlight.php .code .doctag { + color: #a71d5d; } + +.highlight.php .code .regexp { + color: #df5000; } + +.highlight.php .code .literal, +.highlight.php .code .number { + color: #0086b3; } + +.highlight.php .code .title { + color: #795da3; } + +.highlight.python .code .decorator, +.highlight.python .code .title, +.highlight.python .code .meta { + color: #795da3; } + +.highlight.python .code .number { + color: #0086b3; } + +.highlight.ruby .code .parent, +.highlight.ruby .code .title { + color: #795da3; } + +.highlight.ruby .code .prompt, +.highlight.ruby .code .constant, +.highlight.ruby .code .number, +.highlight.ruby .code .subst .keyword, +.highlight.ruby .code .symbol { + color: #0086b3; } + +.highlight.sql .built_in { + color: #a71d5d; } + +.highlight.sql .number { + color: #0086b3; } + +.highlight.xml .tag, .highlight.html .tag { + color: #333; } + +.highlight.xml .value, .highlight.html .value { + color: #183691; } + +.highlight.xml .attribute, +.highlight.xml .attr, .highlight.html .attribute, +.highlight.html .attr { + color: #795da3; } + +.highlight.xml .title, +.highlight.xml .name, .highlight.html .title, +.highlight.html .name { + color: #63a35c; } + +.highlight.puppet .title { + color: #795da3; } + +.highlight.puppet .function { + color: #0086b3; } + +.highlight.puppet .name { + color: #a71d5d; } + +.highlight.puppet .attr { + color: #0086b3; } + +.highlight.less .tag, +.highlight.less .at_rule { + color: #a71d5d; } + +.highlight.less .number, +.highlight.less .hexcolor, +.highlight.less .function, +.highlight.less .attribute { + color: #0086b3; } + +.highlight.less .built_in { + color: #df5000; } + +.highlight.less .id, +.highlight.less .pseudo, +.highlight.less .class, +.highlight.less .selector-id, +.highlight.less .selector-class, +.highlight.less .selector-tag { + color: #795da3; } + +.highlight.scss .tag, +.highlight.scss .at_rule, +.highlight.scss .important { + color: #a71d5d; } + +.highlight.scss .number, +.highlight.scss .hexcolor, +.highlight.scss .function, +.highlight.scss .attribute { + color: #0086b3; } + +.highlight.scss .variable { + color: #333; } + +.highlight.scss .built_in { + color: #df5000; } + +.highlight.scss .id, +.highlight.scss .pseudo, +.highlight.scss .class, +.highlight.scss .preprocessor, +.highlight.scss .selector-class, +.highlight.scss .selector-id { + color: #795da3; } + +.highlight.scss .tag, +.highlight.scss .selector-tag { + color: #63a35c; } + +.highlight.stylus .at_rule { + color: #a71d5d; } + +.highlight.stylus .tag, +.highlight.stylus .selector-tag { + color: #63a35c; } + +.highlight.stylus .number, +.highlight.stylus .hexcolor, +.highlight.stylus .attribute, +.highlight.stylus .params { + color: #0086b3; } + +.highlight.stylus .class, +.highlight.stylus .id, +.highlight.stylus .pseudo, +.highlight.stylus .title, +.highlight.stylus .selector-id, +.highlight.stylus .selector-pseudo, +.highlight.stylus .selector-class { + color: #795da3; } + +.highlight.go .typename { + color: #a71d5d; } + +.highlight.go .built_in, +.highlight.go .constant { + color: #0086b3; } + +.highlight.swift .preprocessor { + color: #a71d5d; } + +.highlight.swift .title { + color: #795da3; } + +.highlight.swift .built_in, +.highlight.swift .number, +.highlight.swift .type { + color: #0086b3; } + +.highlight.yml .line, +.highlight.yml .attr { + color: #63a35c; } + +.highlight.yml .line, +.highlight.yml .string, +.highlight.yml .type, +.highlight.yml .literal, +.highlight.yml .meta { + color: #183691; } + +.highlight.yml .number { + color: #0086b3; } + +/* post navigator*/ +.post-nav { + overflow: hidden; + margin-top: 15px; + margin-bottom: 20px; + padding: 10px; + white-space: nowrap; + border-top: 1px solid #eee; } + .post-nav a { + display: inline-block; + line-height: 25px; + font-size: 15px; + color: #555; + border-bottom: none; + float: left; } + .post-nav a.pre { + float: left; } + .post-nav a.pre:before { + font-family: "FontAwesome"; + content: "\f0d9"; + padding-right: 0.3em; } + .post-nav a.next { + float: right; } + .post-nav a.next:after { + font-family: "FontAwesome"; + content: "\f0da"; + padding-left: 0.3em; } + .post-nav a:hover { + border-bottom: none; + color: #222; } + +/* toc*/ +.toc-article { + border: 1px solid #bbb; + border-radius: 7px; + margin: 1.1em 0 0 2em; + padding: 0.7em 0.7em 0 0.7em; + max-width: 40%; } + +.toc-title { + font-size: 120%; } + +#toc { + line-height: 1em; + float: right; } + #toc .toc { + padding: 0; + margin: 0.5em; + line-height: 1.8em; } + #toc .toc li { + list-style-type: none; } + #toc .toc-child { + margin-left: 1em; + padding-left: 0; } + +/* table*/ +table { + margin: auto auto 15px; + width: 100%; + background: transparent; + border-collapse: collapse; + border-spacing: 0; + text-align: left; } + table th { + font-weight: bold; + padding: 5px 10px; + border-bottom: 2px solid #909ba2; } + table td { + padding: 5px 10px; } + table tr:nth-child(2n) { + background: #f7f8f8; } + +/* article-share*/ +.article-share-link { + cursor: pointer; + float: right; + margin-left: 20px; } + .article-share-link:before { + font-family: "FontAwesome"; + content: "\f064"; + padding-right: 6px; } + +.article-share-box { + position: absolute; + display: none; + background: #fff; + box-shadow: 1px 2px 10px rgba(0, 0, 0, 0.2); + border-radius: 3px; + margin-left: -145px; + overflow: hidden; + z-index: 1; } + .article-share-box.on { + display: block; } + +.article-share-input { + width: 100%; + background: none; + box-sizing: border-box; + font: 14px "Helvetica Neue", Helvetica, Arial, sans-serif; + padding: 0 15px; + color: #555; + outline: none; + border: 1px solid #ddd; + border-radius: 3px 3px 0 0; + height: 36px; + line-height: 36px; } + +.article-share-links { + clearfix: none; + background: #eee; } + +.article-share-element, .article-share-twitter, .article-share-facebook, .article-share-weibo, .article-share-qrcode { + width: 50px; + height: 36px; + display: block; + float: left; + position: relative; + color: #999; + text-shadow: 0 1px #fff; } + .article-share-element:before, .article-share-twitter:before, .article-share-facebook:before, .article-share-weibo:before, .article-share-qrcode:before { + font-size: 20px; + font-family: "FontAwesome"; + width: 20px; + height: 20px; + position: absolute; + top: 50%; + left: 50%; + margin-top: -10px; + margin-left: -10px; + text-align: center; } + .article-share-element:hover, .article-share-twitter:hover, .article-share-facebook:hover, .article-share-weibo:hover, .article-share-qrcode:hover { + color: #fff; } + +.article-share-twitter:before { + content: "\f099"; } + +.article-share-twitter:hover { + background: #00aced; } + +.article-share-facebook:before { + content: "\f09a"; } + +.article-share-facebook:hover { + background: #3b5998; } + +.article-share-weibo:before { + content: "\f18a"; } + +.article-share-weibo:hover { + background: #d44137; } + +.article-share-qrcode:before { + content: "\f029"; } + +.article-share-qrcode:hover, .article-share-qrcode:active { + background: #38ad5a; } + .article-share-qrcode:hover ~ .qrcode, .article-share-qrcode:active ~ .qrcode { + display: block; + text-align: center; } + +.qrcode { + display: none; } + +/* search result*/ +ul.search-result-list { + padding-left: 10px; } + +a.search-result-title { + font-weight: bold; + font-size: 15px; + color: #555; } + +p.search-result { + color: #444; + text-align: justify; } + +em.search-keyword { + font-weight: bold; + font-style: normal; + color: #01579f; } + +/* Disqus Button */ +.disqus_click_btn { + line-height: 30px; + margin: 0; + min-width: 50px; + padding: 0 14px; + display: inline-block; + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-size: 14px; + font-weight: 400; + letter-spacing: 0; + overflow: hidden; + will-change: box-shadow; + transition: box-shadow 0.2s cubic-bezier(0.4, 0, 1, 1), background-color 0.2s cubic-bezier(0.4, 0, 0.2, 1), color 0.2s cubic-bezier(0.4, 0, 0.2, 1); + outline: 0; + cursor: pointer; + text-decoration: none; + text-align: center; + vertical-align: middle; + border: 0; + background: rgba(158, 158, 158, 0.2); + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 1px 5px 0 rgba(0, 0, 0, 0.12); + color: #fff; + background-color: #999999; + text-shadow: 0; } + +.post-copyright { + margin: 2em 0 0; + padding: 0.5em 1em; + border-left: 3px solid #FF1700; + background-color: #F9F9F9; + list-style: none; } + .post-copyright li { + margin: 8px 0; } diff --git a/donate/index.html b/donate/index.html new file mode 100644 index 00000000..c2b53d7f --- /dev/null +++ b/donate/index.html @@ -0,0 +1,28 @@ + + + + + Donate-Page + + + + + + + + + +
Donate
+ +
+
+
+ + + + diff --git a/edusmart/index.html b/edusmart/index.html new file mode 100644 index 00000000..9478d41c --- /dev/null +++ b/edusmart/index.html @@ -0,0 +1,138 @@ +EOS完全开发指南 | HackDApp

EOS完全开发指南

为你提供最完整的EOS知识结构图谱,与EOS公链版本同步更新技术知识点。

+
+

🔗 文章阅读: http://learneos.hackdapp.com

+
+

第一部分、C++导读

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
1.0 简易程序入门1.1 C++基础语法1.2 基础数据类型及变量、常量定义1.3 结构体及函数定义
1.4 数据结构1.5 面向对象编程1.6 高级应用(模板定义)1.7 标准库及库函数
1.8 资料及经验分享
+

第二部分、EOS开发所必须掌握的基础概念与术语

+ + + + + + + + + + + + + + + + +
2.1 帐户及公私钥2.2 智能合约2.3 共识机制2.4 ABI/WASM
+

第三部分、深入理解智能合约

第四部分、高级应用技巧

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
5.1 存储合约数据5.2 多个合约间交互5.3 定制TOKEN合约、发行及转帐交互5.4 同步与异步调用合约方法
5.5 打包数据上链5.6 随机数生成5.7 预言机,与外部世界通讯5.8 合约内数据加密
5.9 合约编译5.10 合约发布与升级5.11 合约测试5.12 合约设计与实现
5.13 合约权限5.13 合约漏洞与安全防护
+

第五部分、剖析第三方合约

第六部分、实战开发—去中心化游戏

+ + + + + + + + + + + + + + + + + + + + + +
6.1 配置开发环境6.2 搭建项目工程6.3 合约开发6.4 UI及后端服务开发
6.5 服务部署与上线
+

更详细大纲请移步至🔗 : http://learneos.hackdapp.com

+
+

欢迎关注HackDApp博客或公众号, HackHook将持续为你分享IndieMaker成长路径、DAPP技术知识、高效Mac使用技巧、底层思维认知。

+
+

我的博客: https://www.hackdapp.com/
我的github: https://github.com/hackdapp
我的哔哩哔哩: https://space.bilibili.com/17360859
我的微信公众号: hackdapp

IndieMakers: https://www.indiemakers.cn

+
+

联系邮箱:55269778@qq.com

+
\ No newline at end of file diff --git a/source/favicon.ico b/favicon.ico similarity index 100% rename from source/favicon.ico rename to favicon.ico diff --git a/source/google1031035202c817c5.html b/google1031035202c817c5.html similarity index 74% rename from source/google1031035202c817c5.html rename to google1031035202c817c5.html index d145a37a..9dc73cbe 100644 --- a/source/google1031035202c817c5.html +++ b/google1031035202c817c5.html @@ -1,3 +1 @@ -layout: false ---- google-site-verification: google1031035202c817c5.html \ No newline at end of file diff --git a/grownth/index.html b/grownth/index.html new file mode 100644 index 00000000..a63e42bf --- /dev/null +++ b/grownth/index.html @@ -0,0 +1,34 @@ +EOS完全开发手册 | HackDApp

EOS完全开发手册

+
\ No newline at end of file diff --git a/history/index.html b/history/index.html new file mode 100644 index 00000000..0fb32d99 --- /dev/null +++ b/history/index.html @@ -0,0 +1,27 @@ + | HackDApp

Now
Past
1
2019-Now +转战更高价值的方向
2
2018 +充电一年
3
2017 +区块链之年
4
2016 +儿子降生
\ No newline at end of file diff --git a/img/AliPayQR.png b/img/AliPayQR.png new file mode 100644 index 00000000..e54760e3 Binary files /dev/null and b/img/AliPayQR.png differ diff --git a/img/BTCQR.png b/img/BTCQR.png new file mode 100644 index 00000000..b7cd7d43 Binary files /dev/null and b/img/BTCQR.png differ diff --git a/img/WeChatQR.png b/img/WeChatQR.png new file mode 100644 index 00000000..2fab71ef Binary files /dev/null and b/img/WeChatQR.png differ diff --git a/img/alipay.svg b/img/alipay.svg new file mode 100644 index 00000000..2e789675 --- /dev/null +++ b/img/alipay.svg @@ -0,0 +1,46 @@ + + + + + + + + + + +]> + + + + + + + + + + + + + + + + + + + diff --git a/img/bitcoin.svg b/img/bitcoin.svg new file mode 100644 index 00000000..dc64d878 --- /dev/null +++ b/img/bitcoin.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/github.svg b/img/github.svg new file mode 100644 index 00000000..7d9f99ff --- /dev/null +++ b/img/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/like.svg b/img/like.svg new file mode 100644 index 00000000..44adab30 --- /dev/null +++ b/img/like.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/img/paypal.svg b/img/paypal.svg new file mode 100644 index 00000000..cdacb583 --- /dev/null +++ b/img/paypal.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + diff --git a/img/wechat.svg b/img/wechat.svg new file mode 100644 index 00000000..c5d50af6 --- /dev/null +++ b/img/wechat.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 00000000..81ce09d3 --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ +HackDApp | Focus on DApp tutorials, Thinking growth, Mac skills, IndieMaker, etc.

基于以太坊的NFT开发实践

课程大纲

第一部分、项目总览

    Read More

    如何做好课堂笔记

    Read More

    如何提高防猝死的能力

    猝死就是平时身体健康、或貌似健康的患者,在出乎意料的短时间内,因自然疾病而突然死亡.

    +

    猝死,如此可怕,是哪些原因导致的呢?
    85%是心血管问题,这其中,又有80%是给心脏供血的冠状动脉突发缺血了。

    +

    那么,猝死我们可以预防或控制吗?
    好消息是,绝大部分情况可以,前提是你要有足够的心脏储备。而储备,是心血管健康里最容易被忽视的一个维度。所谓心力储备,就是心脏因身体的需要而增加射血的能力。所以,大部分情况下,猝死是由于心力储备坍塌导致的。

    Read More

    如何用61分钟写出漂亮的推广文案

    如何用最少的时间写出最漂亮的广告推广文案呢?今天就向你推荐一个写作框架。,点击【ReadMore】,了解更多详情。

    Read More

    交易者应掌握的能力

    无论是在股市或是币市,我们都希望通过自己的一顿神操作,买到那些可以让自己瞬间反几倍甚至几十倍的股票或数字货币,但现实情况
    会告诉你,即使是牛市你也能亏钱亏的要死。

    +

    为什么呢?这就不得不想想其中你想赚钱的行为,是一种投机还是投资?

    +

    投机呢,完全可能就是全凭着几个火热大群的fomo情绪,亦或是好巧不巧的几个自己认为重要的小道消息,就认为自己拿到了人生财富密码,知道自己输的底朝天;而投资往往是通过自己对标的物,花精力与时间去研究思考,挖机出它的长期价值,尤其是那些被低估的标的,即使是自己决策失误,也会总结教训,从错误中反思,改进自己的投资方法论,不错失提升自己大脑🧠成长的机会。

    Read More

    如何提高收益风险比

    什么是收益风险比呢? 字面意思不难理解,就是: 收益风险比 = 可能的收益 / 未知的风险。

    +

    为什么需要认识并提升自己的收益风险比呢? 因为像我这样打工人,除了工资之外,就没有其他收入了,如果被辞职或家里出些什么事,无论是家庭生活质量还是自己的心理焦虑,都会受到极大的生存压力。而投资作为被动收入的一种手段,就可以提升我们在工作单一收入上的安全度,而提升收益风险比,就是在这一基础上能够获得更大的回报。

    Read More

    C++简单程序入门

    C++简单程序入门. 以最简单的示例代码,为你拆解其脉络结构。上手C++对你来说,那不是难事。

    Read More

    \ No newline at end of file diff --git a/js/codeblock-resizer.js b/js/codeblock-resizer.js new file mode 100644 index 00000000..96fd57fd --- /dev/null +++ b/js/codeblock-resizer.js @@ -0,0 +1,51 @@ ++function($) { + 'use strict'; + + // Resize code blocks to fit the screen width + + var CodeBlockResizer = function(elem) { + this.$codeBlocks = $(elem); + }; + + CodeBlockResizer.prototype = { + /** + * Run main feature + */ + run: function() { + var self = this; + // resize all codeblocks + self.resize(); + // resize codeblocks when window is resized + $(window).smartresize(function() { + self.resize(); + }); + }, + + /** + * Resize codeblocks + */ + resize: function() { + var self = this; + self.$codeBlocks.each(function() { + var $gutter = $(this).find('.gutter'); + var $code = $(this).find('.code'); + // get padding of code div + var codePaddings = $code.width() - $code.innerWidth(); + // code block div width with padding - gutter div with padding + code div padding + var width = $(this).outerWidth() - $gutter.outerWidth() + codePaddings; + // apply new width + $code.css('width', width); + $code.children('pre').css('width', width); + }); + } + }; + + $(document).ready(function() { + // register jQuery function to check if an element has an horizontal scroll bar + $.fn.hasHorizontalScrollBar = function() { + return this.get(0).scrollWidth > this.innerWidth(); + }; + var resizer = new CodeBlockResizer('figure.highlight'); + resizer.run(); + }); +}(jQuery); diff --git a/js/donate.js b/js/donate.js new file mode 100644 index 00000000..da3989bc --- /dev/null +++ b/js/donate.js @@ -0,0 +1,78 @@ +(function($) { + $.getUrlParam = function(name) { + var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); + var r = window.location.search.substr(1).match(reg); + if(r && r[2] && r[2] != 'null' && r[2] != 'undefined' && r[2] != '') { + return unescape(r[2]); + } else { + return null; + } + } +})(jQuery); +jQuery(document).ready(function() { + $("#github").attr('href', $.getUrlParam('GitHub') || "https://github.com/" + window.location.href.split(".github.io")[0].split("/").pop()) + var QRBox = $('#QRBox'); + var MainBox = $('#MainBox'); + var count = 0; + $("li").hide(); + if($.getUrlParam('BTCQR') && $.getUrlParam('BTCKEY')) { + var BTCQR = $.getUrlParam('BTCQR'); // 二维码路径 + var BTCKEY = $.getUrlParam('BTCKEY'); + count++; + $("#BTC").show(); + $("#BTC").addClass('yc') + $("#btc-key").attr("value",BTCKEY) + } + if($.getUrlParam('AliPayQR')) { + var AliPayQR = $.getUrlParam('AliPayQR'); + count++; + $("#AliPay").show(); + } + if($.getUrlParam('WeChatQR')) { + var WeChatQR = $.getUrlParam('WeChatQR'); + count++; + $("#WeChat").show(); + } + if($.getUrlParam('PayPal')) { + var PayPal = $.getUrlParam('PayPal'); + count++; + $("#PayPal a").attr("href",PayPal) + $("#PayPal").show(); + } + if(count == 0){ + $("#WeChat").after('
    没有开启任何Donate选项!
    '); + } + $("#donateBox li,#donateBox li a").css("width", Math.ceil(74+(74*(4-count)/count))+"px"); + function showQR(QR) { + if(QR) { + MainBox.css('background-image', 'url(' + QR + ')'); + } + $('#DonateText,#donateBox,#github').addClass('blur'); + QRBox.fadeIn(300, function(argument) { + MainBox.addClass('showQR'); + }); + } + + $('#donateBox>li').click(function(event) { + var thisID = $(this).attr('id'); + if(thisID === 'BTC') { + showQR(BTCQR); + new Clipboard('#BTCBn'); + } else if(thisID === 'AliPay') { + showQR(AliPayQR); + } else if(thisID === 'WeChat') { + showQR(WeChatQR); + } + }); + + MainBox.click(function(event) { + MainBox.removeClass('showQR').addClass('hideQR'); + setTimeout(function(a) { + QRBox.fadeOut(300, function(argument) { + MainBox.removeClass('hideQR'); + }); + $('#DonateText,#donateBox,#github').removeClass('blur'); + }, 600); + + }); +}); diff --git a/js/fancybox.js b/js/fancybox.js new file mode 100644 index 00000000..3535a346 --- /dev/null +++ b/js/fancybox.js @@ -0,0 +1,19 @@ +$(document).ready(function() { + $('img').each(function() { + if ($(this).parent().hasClass('fancybox')) return; + if ($(this).hasClass('nofancybox')) return; + var alt = this.alt; + if (alt) $(this).after('' + alt + ''); + $(this).wrap(''); + }); + $(this).find('.fancybox').each(function(){ + $(this).attr('rel', 'article'); + }); +}); +$(document).ready(function() { + $("a[href$='.jpg'],a[href$='.png'],a[href$='.gif'],a[href$='.webp']").attr('rel', 'gallery').fancybox({ + helpers : { + title: { type: 'inside'} + } + }); +}); diff --git a/js/gitment.browser.js b/js/gitment.browser.js new file mode 100644 index 00000000..06e13226 --- /dev/null +++ b/js/gitment.browser.js @@ -0,0 +1,3751 @@ +var Gitment = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) +/******/ return installedModules[moduleId].exports; +/******/ +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 5); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var LS_ACCESS_TOKEN_KEY = exports.LS_ACCESS_TOKEN_KEY = 'gitment-comments-token'; +var LS_USER_KEY = exports.LS_USER_KEY = 'gitment-user-info'; + +var NOT_INITIALIZED_ERROR = exports.NOT_INITIALIZED_ERROR = new Error('Comments Not Initialized'); + +/***/ }), +/* 1 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* WEBPACK VAR INJECTION */(function(global) { + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var __extends = undefined && undefined.__extends || function () { + var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) { + d.__proto__ = b; + } || function (d, b) { + for (var p in b) { + if (b.hasOwnProperty(p)) d[p] = b[p]; + } + }; + return function (d, b) { + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +}(); +Object.defineProperty(exports, "__esModule", { value: true }); +registerGlobals(); +exports.extras = { + allowStateChanges: allowStateChanges, + deepEqual: deepEqual, + getAtom: getAtom, + getDebugName: getDebugName, + getDependencyTree: getDependencyTree, + getAdministration: getAdministration, + getGlobalState: getGlobalState, + getObserverTree: getObserverTree, + isComputingDerivation: isComputingDerivation, + isSpyEnabled: isSpyEnabled, + onReactionError: onReactionError, + resetGlobalState: resetGlobalState, + shareGlobalState: shareGlobalState, + spyReport: spyReport, + spyReportEnd: spyReportEnd, + spyReportStart: spyReportStart, + setReactionScheduler: setReactionScheduler +}; +if ((typeof __MOBX_DEVTOOLS_GLOBAL_HOOK__ === "undefined" ? "undefined" : _typeof(__MOBX_DEVTOOLS_GLOBAL_HOOK__)) === "object") { + __MOBX_DEVTOOLS_GLOBAL_HOOK__.injectMobx(module.exports); +} +module.exports.default = module.exports; +var actionFieldDecorator = createClassPropertyDecorator(function (target, key, value, args, originalDescriptor) { + var actionName = args && args.length === 1 ? args[0] : value.name || key || ""; + var wrappedAction = action(actionName, value); + addHiddenProp(target, key, wrappedAction); +}, function (key) { + return this[key]; +}, function () { + invariant(false, getMessage("m001")); +}, false, true); +var boundActionDecorator = createClassPropertyDecorator(function (target, key, value) { + defineBoundAction(target, key, value); +}, function (key) { + return this[key]; +}, function () { + invariant(false, getMessage("m001")); +}, false, false); +var action = function action(arg1, arg2, arg3, arg4) { + if (arguments.length === 1 && typeof arg1 === "function") return createAction(arg1.name || "", arg1); + if (arguments.length === 2 && typeof arg2 === "function") return createAction(arg1, arg2); + if (arguments.length === 1 && typeof arg1 === "string") return namedActionDecorator(arg1); + return namedActionDecorator(arg2).apply(null, arguments); +}; +exports.action = action; +action.bound = function boundAction(arg1, arg2, arg3) { + if (typeof arg1 === "function") { + var action_1 = createAction("", arg1); + action_1.autoBind = true; + return action_1; + } + return boundActionDecorator.apply(null, arguments); +}; +function namedActionDecorator(name) { + return function (target, prop, descriptor) { + if (descriptor && typeof descriptor.value === "function") { + descriptor.value = createAction(name, descriptor.value); + descriptor.enumerable = false; + descriptor.configurable = true; + return descriptor; + } + return actionFieldDecorator(name).apply(this, arguments); + }; +} +function runInAction(arg1, arg2, arg3) { + var actionName = typeof arg1 === "string" ? arg1 : arg1.name || ""; + var fn = typeof arg1 === "function" ? arg1 : arg2; + var scope = typeof arg1 === "function" ? arg2 : arg3; + invariant(typeof fn === "function", getMessage("m002")); + invariant(fn.length === 0, getMessage("m003")); + invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'"); + return executeAction(actionName, fn, scope, undefined); +} +exports.runInAction = runInAction; +function isAction(thing) { + return typeof thing === "function" && thing.isMobxAction === true; +} +exports.isAction = isAction; +function defineBoundAction(target, propertyName, fn) { + var res = function res() { + return executeAction(propertyName, fn, target, arguments); + }; + res.isMobxAction = true; + addHiddenProp(target, propertyName, res); +} +function autorun(arg1, arg2, arg3) { + var name, view, scope; + if (typeof arg1 === "string") { + name = arg1; + view = arg2; + scope = arg3; + } else { + name = arg1.name || "Autorun@" + getNextId(); + view = arg1; + scope = arg2; + } + invariant(typeof view === "function", getMessage("m004")); + invariant(isAction(view) === false, getMessage("m005")); + if (scope) view = view.bind(scope); + var reaction = new Reaction(name, function () { + this.track(reactionRunner); + }); + function reactionRunner() { + view(reaction); + } + reaction.schedule(); + return reaction.getDisposer(); +} +exports.autorun = autorun; +function when(arg1, arg2, arg3, arg4) { + var name, predicate, effect, scope; + if (typeof arg1 === "string") { + name = arg1; + predicate = arg2; + effect = arg3; + scope = arg4; + } else { + name = "When@" + getNextId(); + predicate = arg1; + effect = arg2; + scope = arg3; + } + var disposer = autorun(name, function (r) { + if (predicate.call(scope)) { + r.dispose(); + var prevUntracked = untrackedStart(); + effect.call(scope); + untrackedEnd(prevUntracked); + } + }); + return disposer; +} +exports.when = when; +function autorunAsync(arg1, arg2, arg3, arg4) { + var name, func, delay, scope; + if (typeof arg1 === "string") { + name = arg1; + func = arg2; + delay = arg3; + scope = arg4; + } else { + name = arg1.name || "AutorunAsync@" + getNextId(); + func = arg1; + delay = arg2; + scope = arg3; + } + invariant(isAction(func) === false, getMessage("m006")); + if (delay === void 0) delay = 1; + if (scope) func = func.bind(scope); + var isScheduled = false; + var r = new Reaction(name, function () { + if (!isScheduled) { + isScheduled = true; + setTimeout(function () { + isScheduled = false; + if (!r.isDisposed) r.track(reactionRunner); + }, delay); + } + }); + function reactionRunner() { + func(r); + } + r.schedule(); + return r.getDisposer(); +} +exports.autorunAsync = autorunAsync; +function reaction(expression, effect, arg3) { + if (arguments.length > 3) { + fail(getMessage("m007")); + } + if (isModifierDescriptor(expression)) { + fail(getMessage("m008")); + } + var opts; + if ((typeof arg3 === "undefined" ? "undefined" : _typeof(arg3)) === "object") { + opts = arg3; + } else { + opts = {}; + } + opts.name = opts.name || expression.name || effect.name || "Reaction@" + getNextId(); + opts.fireImmediately = arg3 === true || opts.fireImmediately === true; + opts.delay = opts.delay || 0; + opts.compareStructural = opts.compareStructural || opts.struct || false; + effect = action(opts.name, opts.context ? effect.bind(opts.context) : effect); + if (opts.context) { + expression = expression.bind(opts.context); + } + var firstTime = true; + var isScheduled = false; + var nextValue; + var r = new Reaction(opts.name, function () { + if (firstTime || opts.delay < 1) { + reactionRunner(); + } else if (!isScheduled) { + isScheduled = true; + setTimeout(function () { + isScheduled = false; + reactionRunner(); + }, opts.delay); + } + }); + function reactionRunner() { + if (r.isDisposed) return; + var changed = false; + r.track(function () { + var v = expression(r); + changed = valueDidChange(opts.compareStructural, nextValue, v); + nextValue = v; + }); + if (firstTime && opts.fireImmediately) effect(nextValue, r); + if (!firstTime && changed === true) effect(nextValue, r); + if (firstTime) firstTime = false; + } + r.schedule(); + return r.getDisposer(); +} +exports.reaction = reaction; +function createComputedDecorator(compareStructural) { + return createClassPropertyDecorator(function (target, name, _, __, originalDescriptor) { + invariant(typeof originalDescriptor !== "undefined", getMessage("m009")); + invariant(typeof originalDescriptor.get === "function", getMessage("m010")); + var adm = asObservableObject(target, ""); + defineComputedProperty(adm, name, originalDescriptor.get, originalDescriptor.set, compareStructural, false); + }, function (name) { + var observable = this.$mobx.values[name]; + if (observable === undefined) return undefined; + return observable.get(); + }, function (name, value) { + this.$mobx.values[name].set(value); + }, false, false); +} +var computedDecorator = createComputedDecorator(false); +var computedStructDecorator = createComputedDecorator(true); +var computed = function computed(arg1, arg2, arg3) { + if (typeof arg2 === "string") { + return computedDecorator.apply(null, arguments); + } + invariant(typeof arg1 === "function", getMessage("m011")); + invariant(arguments.length < 3, getMessage("m012")); + var opts = (typeof arg2 === "undefined" ? "undefined" : _typeof(arg2)) === "object" ? arg2 : {}; + opts.setter = typeof arg2 === "function" ? arg2 : opts.setter; + return new ComputedValue(arg1, opts.context, opts.compareStructural || opts.struct || false, opts.name || arg1.name || "", opts.setter); +}; +exports.computed = computed; +computed.struct = computedStructDecorator; +function createTransformer(transformer, onCleanup) { + invariant(typeof transformer === "function" && transformer.length < 2, "createTransformer expects a function that accepts one argument"); + var objectCache = {}; + var resetId = globalState.resetId; + var Transformer = function (_super) { + __extends(Transformer, _super); + function Transformer(sourceIdentifier, sourceObject) { + var _this = _super.call(this, function () { + return transformer(sourceObject); + }, undefined, false, "Transformer-" + transformer.name + "-" + sourceIdentifier, undefined) || this; + _this.sourceIdentifier = sourceIdentifier; + _this.sourceObject = sourceObject; + return _this; + } + Transformer.prototype.onBecomeUnobserved = function () { + var lastValue = this.value; + _super.prototype.onBecomeUnobserved.call(this); + delete objectCache[this.sourceIdentifier]; + if (onCleanup) onCleanup(lastValue, this.sourceObject); + }; + return Transformer; + }(ComputedValue); + return function (object) { + if (resetId !== globalState.resetId) { + objectCache = {}; + resetId = globalState.resetId; + } + var identifier = getMemoizationId(object); + var reactiveTransformer = objectCache[identifier]; + if (reactiveTransformer) return reactiveTransformer.get(); + reactiveTransformer = objectCache[identifier] = new Transformer(identifier, object); + return reactiveTransformer.get(); + }; +} +exports.createTransformer = createTransformer; +function getMemoizationId(object) { + if (object === null || (typeof object === "undefined" ? "undefined" : _typeof(object)) !== "object") throw new Error("[mobx] transform expected some kind of object, got: " + object); + var tid = object.$transformId; + if (tid === undefined) { + tid = getNextId(); + addHiddenProp(object, "$transformId", tid); + } + return tid; +} +function expr(expr, scope) { + if (!isComputingDerivation()) console.warn(getMessage("m013")); + return computed(expr, { context: scope }).get(); +} +exports.expr = expr; +function extendObservable(target) { + var properties = []; + for (var _i = 1; _i < arguments.length; _i++) { + properties[_i - 1] = arguments[_i]; + } + return extendObservableHelper(target, deepEnhancer, properties); +} +exports.extendObservable = extendObservable; +function extendShallowObservable(target) { + var properties = []; + for (var _i = 1; _i < arguments.length; _i++) { + properties[_i - 1] = arguments[_i]; + } + return extendObservableHelper(target, referenceEnhancer, properties); +} +exports.extendShallowObservable = extendShallowObservable; +function extendObservableHelper(target, defaultEnhancer, properties) { + invariant(arguments.length >= 2, getMessage("m014")); + invariant((typeof target === "undefined" ? "undefined" : _typeof(target)) === "object", getMessage("m015")); + invariant(!isObservableMap(target), getMessage("m016")); + properties.forEach(function (propSet) { + invariant((typeof propSet === "undefined" ? "undefined" : _typeof(propSet)) === "object", getMessage("m017")); + invariant(!isObservable(propSet), getMessage("m018")); + }); + var adm = asObservableObject(target); + var definedProps = {}; + for (var i = properties.length - 1; i >= 0; i--) { + var propSet = properties[i]; + for (var key in propSet) { + if (definedProps[key] !== true && hasOwnProperty(propSet, key)) { + definedProps[key] = true; + if (target === propSet && !isPropertyConfigurable(target, key)) continue; + var descriptor = Object.getOwnPropertyDescriptor(propSet, key); + defineObservablePropertyFromDescriptor(adm, key, descriptor, defaultEnhancer); + } + } + } + return target; +} +function getDependencyTree(thing, property) { + return nodeToDependencyTree(getAtom(thing, property)); +} +function nodeToDependencyTree(node) { + var result = { + name: node.name + }; + if (node.observing && node.observing.length > 0) result.dependencies = unique(node.observing).map(nodeToDependencyTree); + return result; +} +function getObserverTree(thing, property) { + return nodeToObserverTree(getAtom(thing, property)); +} +function nodeToObserverTree(node) { + var result = { + name: node.name + }; + if (hasObservers(node)) result.observers = getObservers(node).map(nodeToObserverTree); + return result; +} +function intercept(thing, propOrHandler, handler) { + if (typeof handler === "function") return interceptProperty(thing, propOrHandler, handler);else return interceptInterceptable(thing, propOrHandler); +} +exports.intercept = intercept; +function interceptInterceptable(thing, handler) { + return getAdministration(thing).intercept(handler); +} +function interceptProperty(thing, property, handler) { + return getAdministration(thing, property).intercept(handler); +} +function isComputed(value, property) { + if (value === null || value === undefined) return false; + if (property !== undefined) { + if (isObservableObject(value) === false) return false; + var atom = getAtom(value, property); + return isComputedValue(atom); + } + return isComputedValue(value); +} +exports.isComputed = isComputed; +function isObservable(value, property) { + if (value === null || value === undefined) return false; + if (property !== undefined) { + if (isObservableArray(value) || isObservableMap(value)) throw new Error(getMessage("m019"));else if (isObservableObject(value)) { + var o = value.$mobx; + return o.values && !!o.values[property]; + } + return false; + } + return isObservableObject(value) || !!value.$mobx || isAtom(value) || isReaction(value) || isComputedValue(value); +} +exports.isObservable = isObservable; +var deepDecorator = createDecoratorForEnhancer(deepEnhancer); +var shallowDecorator = createDecoratorForEnhancer(shallowEnhancer); +var refDecorator = createDecoratorForEnhancer(referenceEnhancer); +var deepStructDecorator = createDecoratorForEnhancer(deepStructEnhancer); +var refStructDecorator = createDecoratorForEnhancer(refStructEnhancer); +function createObservable(v) { + if (v === void 0) { + v = undefined; + } + if (typeof arguments[1] === "string") return deepDecorator.apply(null, arguments); + invariant(arguments.length <= 1, getMessage("m021")); + invariant(!isModifierDescriptor(v), getMessage("m020")); + if (isObservable(v)) return v; + var res = deepEnhancer(v, undefined, undefined); + if (res !== v) return res; + return observable.box(v); +} +var IObservableFactories = function () { + function IObservableFactories() {} + IObservableFactories.prototype.box = function (value, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("box"); + return new ObservableValue(value, deepEnhancer, name); + }; + IObservableFactories.prototype.shallowBox = function (value, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowBox"); + return new ObservableValue(value, referenceEnhancer, name); + }; + IObservableFactories.prototype.array = function (initialValues, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("array"); + return new ObservableArray(initialValues, deepEnhancer, name); + }; + IObservableFactories.prototype.shallowArray = function (initialValues, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowArray"); + return new ObservableArray(initialValues, referenceEnhancer, name); + }; + IObservableFactories.prototype.map = function (initialValues, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("map"); + return new ObservableMap(initialValues, deepEnhancer, name); + }; + IObservableFactories.prototype.shallowMap = function (initialValues, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowMap"); + return new ObservableMap(initialValues, referenceEnhancer, name); + }; + IObservableFactories.prototype.object = function (props, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("object"); + var res = {}; + asObservableObject(res, name); + extendObservable(res, props); + return res; + }; + IObservableFactories.prototype.shallowObject = function (props, name) { + if (arguments.length > 2) incorrectlyUsedAsDecorator("shallowObject"); + var res = {}; + asObservableObject(res, name); + extendShallowObservable(res, props); + return res; + }; + IObservableFactories.prototype.ref = function () { + if (arguments.length < 2) { + return createModifierDescriptor(referenceEnhancer, arguments[0]); + } else { + return refDecorator.apply(null, arguments); + } + }; + IObservableFactories.prototype.shallow = function () { + if (arguments.length < 2) { + return createModifierDescriptor(shallowEnhancer, arguments[0]); + } else { + return shallowDecorator.apply(null, arguments); + } + }; + IObservableFactories.prototype.deep = function () { + if (arguments.length < 2) { + return createModifierDescriptor(deepEnhancer, arguments[0]); + } else { + return deepDecorator.apply(null, arguments); + } + }; + IObservableFactories.prototype.struct = function () { + if (arguments.length < 2) { + return createModifierDescriptor(deepStructEnhancer, arguments[0]); + } else { + return deepStructDecorator.apply(null, arguments); + } + }; + return IObservableFactories; +}(); +exports.IObservableFactories = IObservableFactories; +var observable = createObservable; +exports.observable = observable; +Object.keys(IObservableFactories.prototype).forEach(function (key) { + return observable[key] = IObservableFactories.prototype[key]; +}); +observable.deep.struct = observable.struct; +observable.ref.struct = function () { + if (arguments.length < 2) { + return createModifierDescriptor(refStructEnhancer, arguments[0]); + } else { + return refStructDecorator.apply(null, arguments); + } +}; +function incorrectlyUsedAsDecorator(methodName) { + fail("Expected one or two arguments to observable." + methodName + ". Did you accidentally try to use observable." + methodName + " as decorator?"); +} +function createDecoratorForEnhancer(enhancer) { + invariant(!!enhancer, ":("); + return createClassPropertyDecorator(function (target, name, baseValue, _, baseDescriptor) { + assertPropertyConfigurable(target, name); + invariant(!baseDescriptor || !baseDescriptor.get, getMessage("m022")); + var adm = asObservableObject(target, undefined); + defineObservableProperty(adm, name, baseValue, enhancer); + }, function (name) { + var observable = this.$mobx.values[name]; + if (observable === undefined) return undefined; + return observable.get(); + }, function (name, value) { + setPropertyValue(this, name, value); + }, true, false); +} +function observe(thing, propOrCb, cbOrFire, fireImmediately) { + if (typeof cbOrFire === "function") return observeObservableProperty(thing, propOrCb, cbOrFire, fireImmediately);else return observeObservable(thing, propOrCb, cbOrFire); +} +exports.observe = observe; +function observeObservable(thing, listener, fireImmediately) { + return getAdministration(thing).observe(listener, fireImmediately); +} +function observeObservableProperty(thing, property, listener, fireImmediately) { + return getAdministration(thing, property).observe(listener, fireImmediately); +} +function toJS(source, detectCycles, __alreadySeen) { + if (detectCycles === void 0) { + detectCycles = true; + } + if (__alreadySeen === void 0) { + __alreadySeen = []; + } + function cache(value) { + if (detectCycles) __alreadySeen.push([source, value]); + return value; + } + if (isObservable(source)) { + if (detectCycles && __alreadySeen === null) __alreadySeen = []; + if (detectCycles && source !== null && (typeof source === "undefined" ? "undefined" : _typeof(source)) === "object") { + for (var i = 0, l = __alreadySeen.length; i < l; i++) { + if (__alreadySeen[i][0] === source) return __alreadySeen[i][1]; + } + } + if (isObservableArray(source)) { + var res = cache([]); + var toAdd = source.map(function (value) { + return toJS(value, detectCycles, __alreadySeen); + }); + res.length = toAdd.length; + for (var i = 0, l = toAdd.length; i < l; i++) { + res[i] = toAdd[i]; + }return res; + } + if (isObservableObject(source)) { + var res = cache({}); + for (var key in source) { + res[key] = toJS(source[key], detectCycles, __alreadySeen); + }return res; + } + if (isObservableMap(source)) { + var res_1 = cache({}); + source.forEach(function (value, key) { + return res_1[key] = toJS(value, detectCycles, __alreadySeen); + }); + return res_1; + } + if (isObservableValue(source)) return toJS(source.get(), detectCycles, __alreadySeen); + } + return source; +} +exports.toJS = toJS; +function transaction(action, thisArg) { + if (thisArg === void 0) { + thisArg = undefined; + } + deprecated(getMessage("m023")); + return runInTransaction.apply(undefined, arguments); +} +exports.transaction = transaction; +function runInTransaction(action, thisArg) { + if (thisArg === void 0) { + thisArg = undefined; + } + return executeAction("", action); +} +function log(msg) { + console.log(msg); + return msg; +} +function whyRun(thing, prop) { + switch (arguments.length) { + case 0: + thing = globalState.trackingDerivation; + if (!thing) return log(getMessage("m024")); + break; + case 2: + thing = getAtom(thing, prop); + break; + } + thing = getAtom(thing); + if (isComputedValue(thing)) return log(thing.whyRun());else if (isReaction(thing)) return log(thing.whyRun()); + return fail(getMessage("m025")); +} +exports.whyRun = whyRun; +function createAction(actionName, fn) { + invariant(typeof fn === "function", getMessage("m026")); + invariant(typeof actionName === "string" && actionName.length > 0, "actions should have valid names, got: '" + actionName + "'"); + var res = function res() { + return executeAction(actionName, fn, this, arguments); + }; + res.originalFn = fn; + res.isMobxAction = true; + return res; +} +function executeAction(actionName, fn, scope, args) { + var runInfo = startAction(actionName, fn, scope, args); + try { + return fn.apply(scope, args); + } finally { + endAction(runInfo); + } +} +function startAction(actionName, fn, scope, args) { + var notifySpy = isSpyEnabled() && !!actionName; + var startTime = 0; + if (notifySpy) { + startTime = Date.now(); + var l = args && args.length || 0; + var flattendArgs = new Array(l); + if (l > 0) for (var i = 0; i < l; i++) { + flattendArgs[i] = args[i]; + }spyReportStart({ + type: "action", + name: actionName, + fn: fn, + object: scope, + arguments: flattendArgs + }); + } + var prevDerivation = untrackedStart(); + startBatch(); + var prevAllowStateChanges = allowStateChangesStart(true); + return { + prevDerivation: prevDerivation, + prevAllowStateChanges: prevAllowStateChanges, + notifySpy: notifySpy, + startTime: startTime + }; +} +function endAction(runInfo) { + allowStateChangesEnd(runInfo.prevAllowStateChanges); + endBatch(); + untrackedEnd(runInfo.prevDerivation); + if (runInfo.notifySpy) spyReportEnd({ time: Date.now() - runInfo.startTime }); +} +function useStrict(strict) { + invariant(globalState.trackingDerivation === null, getMessage("m028")); + globalState.strictMode = strict; + globalState.allowStateChanges = !strict; +} +exports.useStrict = useStrict; +function isStrictModeEnabled() { + return globalState.strictMode; +} +exports.isStrictModeEnabled = isStrictModeEnabled; +function allowStateChanges(allowStateChanges, func) { + var prev = allowStateChangesStart(allowStateChanges); + var res; + try { + res = func(); + } finally { + allowStateChangesEnd(prev); + } + return res; +} +function allowStateChangesStart(allowStateChanges) { + var prev = globalState.allowStateChanges; + globalState.allowStateChanges = allowStateChanges; + return prev; +} +function allowStateChangesEnd(prev) { + globalState.allowStateChanges = prev; +} +var BaseAtom = function () { + function BaseAtom(name) { + if (name === void 0) { + name = "Atom@" + getNextId(); + } + this.name = name; + this.isPendingUnobservation = true; + this.observers = []; + this.observersIndexes = {}; + this.diffValue = 0; + this.lastAccessedBy = 0; + this.lowestObserverState = IDerivationState.NOT_TRACKING; + } + BaseAtom.prototype.onBecomeUnobserved = function () {}; + BaseAtom.prototype.reportObserved = function () { + reportObserved(this); + }; + BaseAtom.prototype.reportChanged = function () { + startBatch(); + propagateChanged(this); + endBatch(); + }; + BaseAtom.prototype.toString = function () { + return this.name; + }; + return BaseAtom; +}(); +exports.BaseAtom = BaseAtom; +var Atom = function (_super) { + __extends(Atom, _super); + function Atom(name, onBecomeObservedHandler, onBecomeUnobservedHandler) { + if (name === void 0) { + name = "Atom@" + getNextId(); + } + if (onBecomeObservedHandler === void 0) { + onBecomeObservedHandler = noop; + } + if (onBecomeUnobservedHandler === void 0) { + onBecomeUnobservedHandler = noop; + } + var _this = _super.call(this, name) || this; + _this.name = name; + _this.onBecomeObservedHandler = onBecomeObservedHandler; + _this.onBecomeUnobservedHandler = onBecomeUnobservedHandler; + _this.isPendingUnobservation = false; + _this.isBeingTracked = false; + return _this; + } + Atom.prototype.reportObserved = function () { + startBatch(); + _super.prototype.reportObserved.call(this); + if (!this.isBeingTracked) { + this.isBeingTracked = true; + this.onBecomeObservedHandler(); + } + endBatch(); + return !!globalState.trackingDerivation; + }; + Atom.prototype.onBecomeUnobserved = function () { + this.isBeingTracked = false; + this.onBecomeUnobservedHandler(); + }; + return Atom; +}(BaseAtom); +exports.Atom = Atom; +var isAtom = createInstanceofPredicate("Atom", BaseAtom); +var ComputedValue = function () { + function ComputedValue(derivation, scope, compareStructural, name, setter) { + this.derivation = derivation; + this.scope = scope; + this.compareStructural = compareStructural; + this.dependenciesState = IDerivationState.NOT_TRACKING; + this.observing = []; + this.newObserving = null; + this.isPendingUnobservation = false; + this.observers = []; + this.observersIndexes = {}; + this.diffValue = 0; + this.runId = 0; + this.lastAccessedBy = 0; + this.lowestObserverState = IDerivationState.UP_TO_DATE; + this.unboundDepsCount = 0; + this.__mapid = "#" + getNextId(); + this.value = undefined; + this.isComputing = false; + this.isRunningSetter = false; + this.name = name || "ComputedValue@" + getNextId(); + if (setter) this.setter = createAction(name + "-setter", setter); + } + ComputedValue.prototype.onBecomeStale = function () { + propagateMaybeChanged(this); + }; + ComputedValue.prototype.onBecomeUnobserved = function () { + invariant(this.dependenciesState !== IDerivationState.NOT_TRACKING, getMessage("m029")); + clearObserving(this); + this.value = undefined; + }; + ComputedValue.prototype.get = function () { + invariant(!this.isComputing, "Cycle detected in computation " + this.name, this.derivation); + if (globalState.inBatch === 0) { + startBatch(); + if (shouldCompute(this)) this.value = this.computeValue(false); + endBatch(); + } else { + reportObserved(this); + if (shouldCompute(this)) if (this.trackAndCompute()) propagateChangeConfirmed(this); + } + var result = this.value; + if (isCaughtException(result)) throw result.cause; + return result; + }; + ComputedValue.prototype.peek = function () { + var res = this.computeValue(false); + if (isCaughtException(res)) throw res.cause; + return res; + }; + ComputedValue.prototype.set = function (value) { + if (this.setter) { + invariant(!this.isRunningSetter, "The setter of computed value '" + this.name + "' is trying to update itself. Did you intend to update an _observable_ value, instead of the computed property?"); + this.isRunningSetter = true; + try { + this.setter.call(this.scope, value); + } finally { + this.isRunningSetter = false; + } + } else invariant(false, "[ComputedValue '" + this.name + "'] It is not possible to assign a new value to a computed value."); + }; + ComputedValue.prototype.trackAndCompute = function () { + if (isSpyEnabled()) { + spyReport({ + object: this.scope, + type: "compute", + fn: this.derivation + }); + } + var oldValue = this.value; + var newValue = this.value = this.computeValue(true); + return isCaughtException(newValue) || valueDidChange(this.compareStructural, newValue, oldValue); + }; + ComputedValue.prototype.computeValue = function (track) { + this.isComputing = true; + globalState.computationDepth++; + var res; + if (track) { + res = trackDerivedFunction(this, this.derivation, this.scope); + } else { + try { + res = this.derivation.call(this.scope); + } catch (e) { + res = new CaughtException(e); + } + } + globalState.computationDepth--; + this.isComputing = false; + return res; + }; + ; + ComputedValue.prototype.observe = function (listener, fireImmediately) { + var _this = this; + var firstTime = true; + var prevValue = undefined; + return autorun(function () { + var newValue = _this.get(); + if (!firstTime || fireImmediately) { + var prevU = untrackedStart(); + listener({ + type: "update", + object: _this, + newValue: newValue, + oldValue: prevValue + }); + untrackedEnd(prevU); + } + firstTime = false; + prevValue = newValue; + }); + }; + ComputedValue.prototype.toJSON = function () { + return this.get(); + }; + ComputedValue.prototype.toString = function () { + return this.name + "[" + this.derivation.toString() + "]"; + }; + ComputedValue.prototype.valueOf = function () { + return toPrimitive(this.get()); + }; + ; + ComputedValue.prototype.whyRun = function () { + var isTracking = Boolean(globalState.trackingDerivation); + var observing = unique(this.isComputing ? this.newObserving : this.observing).map(function (dep) { + return dep.name; + }); + var observers = unique(getObservers(this).map(function (dep) { + return dep.name; + })); + return "\nWhyRun? computation '" + this.name + "':\n * Running because: " + (isTracking ? "[active] the value of this computation is needed by a reaction" : this.isComputing ? "[get] The value of this computed was requested outside a reaction" : "[idle] not running at the moment") + "\n" + (this.dependenciesState === IDerivationState.NOT_TRACKING ? getMessage("m032") : " * This computation will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + (this.isComputing && isTracking ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\t" + getMessage("m038") + "\n\n * If the outcome of this computation changes, the following observers will be re-run:\n " + joinStrings(observers) + "\n"); + }; + return ComputedValue; +}(); +ComputedValue.prototype[primitiveSymbol()] = ComputedValue.prototype.valueOf; +var isComputedValue = createInstanceofPredicate("ComputedValue", ComputedValue); +var IDerivationState; +(function (IDerivationState) { + IDerivationState[IDerivationState["NOT_TRACKING"] = -1] = "NOT_TRACKING"; + IDerivationState[IDerivationState["UP_TO_DATE"] = 0] = "UP_TO_DATE"; + IDerivationState[IDerivationState["POSSIBLY_STALE"] = 1] = "POSSIBLY_STALE"; + IDerivationState[IDerivationState["STALE"] = 2] = "STALE"; +})(IDerivationState || (IDerivationState = {})); +exports.IDerivationState = IDerivationState; +var CaughtException = function () { + function CaughtException(cause) { + this.cause = cause; + } + return CaughtException; +}(); +function isCaughtException(e) { + return e instanceof CaughtException; +} +function shouldCompute(derivation) { + switch (derivation.dependenciesState) { + case IDerivationState.UP_TO_DATE: + return false; + case IDerivationState.NOT_TRACKING: + case IDerivationState.STALE: + return true; + case IDerivationState.POSSIBLY_STALE: + { + var prevUntracked = untrackedStart(); + var obs = derivation.observing, + l = obs.length; + for (var i = 0; i < l; i++) { + var obj = obs[i]; + if (isComputedValue(obj)) { + try { + obj.get(); + } catch (e) { + untrackedEnd(prevUntracked); + return true; + } + if (derivation.dependenciesState === IDerivationState.STALE) { + untrackedEnd(prevUntracked); + return true; + } + } + } + changeDependenciesStateTo0(derivation); + untrackedEnd(prevUntracked); + return false; + } + } +} +function isComputingDerivation() { + return globalState.trackingDerivation !== null; +} +function checkIfStateModificationsAreAllowed(atom) { + var hasObservers = atom.observers.length > 0; + if (globalState.computationDepth > 0 && hasObservers) fail(getMessage("m031") + atom.name); + if (!globalState.allowStateChanges && hasObservers) fail(getMessage(globalState.strictMode ? "m030a" : "m030b") + atom.name); +} +function trackDerivedFunction(derivation, f, context) { + changeDependenciesStateTo0(derivation); + derivation.newObserving = new Array(derivation.observing.length + 100); + derivation.unboundDepsCount = 0; + derivation.runId = ++globalState.runId; + var prevTracking = globalState.trackingDerivation; + globalState.trackingDerivation = derivation; + var result; + try { + result = f.call(context); + } catch (e) { + result = new CaughtException(e); + } + globalState.trackingDerivation = prevTracking; + bindDependencies(derivation); + return result; +} +function bindDependencies(derivation) { + var prevObserving = derivation.observing; + var observing = derivation.observing = derivation.newObserving; + derivation.newObserving = null; + var i0 = 0, + l = derivation.unboundDepsCount; + for (var i = 0; i < l; i++) { + var dep = observing[i]; + if (dep.diffValue === 0) { + dep.diffValue = 1; + if (i0 !== i) observing[i0] = dep; + i0++; + } + } + observing.length = i0; + l = prevObserving.length; + while (l--) { + var dep = prevObserving[l]; + if (dep.diffValue === 0) { + removeObserver(dep, derivation); + } + dep.diffValue = 0; + } + while (i0--) { + var dep = observing[i0]; + if (dep.diffValue === 1) { + dep.diffValue = 0; + addObserver(dep, derivation); + } + } +} +function clearObserving(derivation) { + var obs = derivation.observing; + var i = obs.length; + while (i--) { + removeObserver(obs[i], derivation); + }derivation.dependenciesState = IDerivationState.NOT_TRACKING; + obs.length = 0; +} +function untracked(action) { + var prev = untrackedStart(); + var res = action(); + untrackedEnd(prev); + return res; +} +exports.untracked = untracked; +function untrackedStart() { + var prev = globalState.trackingDerivation; + globalState.trackingDerivation = null; + return prev; +} +function untrackedEnd(prev) { + globalState.trackingDerivation = prev; +} +function changeDependenciesStateTo0(derivation) { + if (derivation.dependenciesState === IDerivationState.UP_TO_DATE) return; + derivation.dependenciesState = IDerivationState.UP_TO_DATE; + var obs = derivation.observing; + var i = obs.length; + while (i--) { + obs[i].lowestObserverState = IDerivationState.UP_TO_DATE; + } +} +var persistentKeys = ["mobxGuid", "resetId", "spyListeners", "strictMode", "runId"]; +var MobXGlobals = function () { + function MobXGlobals() { + this.version = 5; + this.trackingDerivation = null; + this.computationDepth = 0; + this.runId = 0; + this.mobxGuid = 0; + this.inBatch = 0; + this.pendingUnobservations = []; + this.pendingReactions = []; + this.isRunningReactions = false; + this.allowStateChanges = true; + this.strictMode = false; + this.resetId = 0; + this.spyListeners = []; + this.globalReactionErrorHandlers = []; + } + return MobXGlobals; +}(); +var globalState = new MobXGlobals(); +function shareGlobalState() { + var global = getGlobal(); + var ownState = globalState; + if (global.__mobservableTrackingStack || global.__mobservableViewStack) throw new Error("[mobx] An incompatible version of mobservable is already loaded."); + if (global.__mobxGlobal && global.__mobxGlobal.version !== ownState.version) throw new Error("[mobx] An incompatible version of mobx is already loaded."); + if (global.__mobxGlobal) globalState = global.__mobxGlobal;else global.__mobxGlobal = ownState; +} +function getGlobalState() { + return globalState; +} +function registerGlobals() {} +function resetGlobalState() { + globalState.resetId++; + var defaultGlobals = new MobXGlobals(); + for (var key in defaultGlobals) { + if (persistentKeys.indexOf(key) === -1) globalState[key] = defaultGlobals[key]; + }globalState.allowStateChanges = !globalState.strictMode; +} +function hasObservers(observable) { + return observable.observers && observable.observers.length > 0; +} +function getObservers(observable) { + return observable.observers; +} +function invariantObservers(observable) { + var list = observable.observers; + var map = observable.observersIndexes; + var l = list.length; + for (var i = 0; i < l; i++) { + var id = list[i].__mapid; + if (i) { + invariant(map[id] === i, "INTERNAL ERROR maps derivation.__mapid to index in list"); + } else { + invariant(!(id in map), "INTERNAL ERROR observer on index 0 shouldnt be held in map."); + } + } + invariant(list.length === 0 || Object.keys(map).length === list.length - 1, "INTERNAL ERROR there is no junk in map"); +} +function addObserver(observable, node) { + var l = observable.observers.length; + if (l) { + observable.observersIndexes[node.__mapid] = l; + } + observable.observers[l] = node; + if (observable.lowestObserverState > node.dependenciesState) observable.lowestObserverState = node.dependenciesState; +} +function removeObserver(observable, node) { + if (observable.observers.length === 1) { + observable.observers.length = 0; + queueForUnobservation(observable); + } else { + var list = observable.observers; + var map_1 = observable.observersIndexes; + var filler = list.pop(); + if (filler !== node) { + var index = map_1[node.__mapid] || 0; + if (index) { + map_1[filler.__mapid] = index; + } else { + delete map_1[filler.__mapid]; + } + list[index] = filler; + } + delete map_1[node.__mapid]; + } +} +function queueForUnobservation(observable) { + if (!observable.isPendingUnobservation) { + observable.isPendingUnobservation = true; + globalState.pendingUnobservations.push(observable); + } +} +function startBatch() { + globalState.inBatch++; +} +function endBatch() { + if (--globalState.inBatch === 0) { + runReactions(); + var list = globalState.pendingUnobservations; + for (var i = 0; i < list.length; i++) { + var observable_1 = list[i]; + observable_1.isPendingUnobservation = false; + if (observable_1.observers.length === 0) { + observable_1.onBecomeUnobserved(); + } + } + globalState.pendingUnobservations = []; + } +} +function reportObserved(observable) { + var derivation = globalState.trackingDerivation; + if (derivation !== null) { + if (derivation.runId !== observable.lastAccessedBy) { + observable.lastAccessedBy = derivation.runId; + derivation.newObserving[derivation.unboundDepsCount++] = observable; + } + } else if (observable.observers.length === 0) { + queueForUnobservation(observable); + } +} +function invariantLOS(observable, msg) { + var min = getObservers(observable).reduce(function (a, b) { + return Math.min(a, b.dependenciesState); + }, 2); + if (min >= observable.lowestObserverState) return; + throw new Error("lowestObserverState is wrong for " + msg + " because " + min + " < " + observable.lowestObserverState); +} +function propagateChanged(observable) { + if (observable.lowestObserverState === IDerivationState.STALE) return; + observable.lowestObserverState = IDerivationState.STALE; + var observers = observable.observers; + var i = observers.length; + while (i--) { + var d = observers[i]; + if (d.dependenciesState === IDerivationState.UP_TO_DATE) d.onBecomeStale(); + d.dependenciesState = IDerivationState.STALE; + } +} +function propagateChangeConfirmed(observable) { + if (observable.lowestObserverState === IDerivationState.STALE) return; + observable.lowestObserverState = IDerivationState.STALE; + var observers = observable.observers; + var i = observers.length; + while (i--) { + var d = observers[i]; + if (d.dependenciesState === IDerivationState.POSSIBLY_STALE) d.dependenciesState = IDerivationState.STALE;else if (d.dependenciesState === IDerivationState.UP_TO_DATE) observable.lowestObserverState = IDerivationState.UP_TO_DATE; + } +} +function propagateMaybeChanged(observable) { + if (observable.lowestObserverState !== IDerivationState.UP_TO_DATE) return; + observable.lowestObserverState = IDerivationState.POSSIBLY_STALE; + var observers = observable.observers; + var i = observers.length; + while (i--) { + var d = observers[i]; + if (d.dependenciesState === IDerivationState.UP_TO_DATE) { + d.dependenciesState = IDerivationState.POSSIBLY_STALE; + d.onBecomeStale(); + } + } +} +var Reaction = function () { + function Reaction(name, onInvalidate) { + if (name === void 0) { + name = "Reaction@" + getNextId(); + } + this.name = name; + this.onInvalidate = onInvalidate; + this.observing = []; + this.newObserving = []; + this.dependenciesState = IDerivationState.NOT_TRACKING; + this.diffValue = 0; + this.runId = 0; + this.unboundDepsCount = 0; + this.__mapid = "#" + getNextId(); + this.isDisposed = false; + this._isScheduled = false; + this._isTrackPending = false; + this._isRunning = false; + } + Reaction.prototype.onBecomeStale = function () { + this.schedule(); + }; + Reaction.prototype.schedule = function () { + if (!this._isScheduled) { + this._isScheduled = true; + globalState.pendingReactions.push(this); + runReactions(); + } + }; + Reaction.prototype.isScheduled = function () { + return this._isScheduled; + }; + Reaction.prototype.runReaction = function () { + if (!this.isDisposed) { + startBatch(); + this._isScheduled = false; + if (shouldCompute(this)) { + this._isTrackPending = true; + this.onInvalidate(); + if (this._isTrackPending && isSpyEnabled()) { + spyReport({ + object: this, + type: "scheduled-reaction" + }); + } + } + endBatch(); + } + }; + Reaction.prototype.track = function (fn) { + startBatch(); + var notify = isSpyEnabled(); + var startTime; + if (notify) { + startTime = Date.now(); + spyReportStart({ + object: this, + type: "reaction", + fn: fn + }); + } + this._isRunning = true; + var result = trackDerivedFunction(this, fn, undefined); + this._isRunning = false; + this._isTrackPending = false; + if (this.isDisposed) { + clearObserving(this); + } + if (isCaughtException(result)) this.reportExceptionInDerivation(result.cause); + if (notify) { + spyReportEnd({ + time: Date.now() - startTime + }); + } + endBatch(); + }; + Reaction.prototype.reportExceptionInDerivation = function (error) { + var _this = this; + if (this.errorHandler) { + this.errorHandler(error, this); + return; + } + var message = "[mobx] Encountered an uncaught exception that was thrown by a reaction or observer component, in: '" + this; + var messageToUser = getMessage("m037"); + console.error(message || messageToUser, error); + if (isSpyEnabled()) { + spyReport({ + type: "error", + message: message, + error: error, + object: this + }); + } + globalState.globalReactionErrorHandlers.forEach(function (f) { + return f(error, _this); + }); + }; + Reaction.prototype.dispose = function () { + if (!this.isDisposed) { + this.isDisposed = true; + if (!this._isRunning) { + startBatch(); + clearObserving(this); + endBatch(); + } + } + }; + Reaction.prototype.getDisposer = function () { + var r = this.dispose.bind(this); + r.$mobx = this; + r.onError = registerErrorHandler; + return r; + }; + Reaction.prototype.toString = function () { + return "Reaction[" + this.name + "]"; + }; + Reaction.prototype.whyRun = function () { + var observing = unique(this._isRunning ? this.newObserving : this.observing).map(function (dep) { + return dep.name; + }); + return "\nWhyRun? reaction '" + this.name + "':\n * Status: [" + (this.isDisposed ? "stopped" : this._isRunning ? "running" : this.isScheduled() ? "scheduled" : "idle") + "]\n * This reaction will re-run if any of the following observables changes:\n " + joinStrings(observing) + "\n " + (this._isRunning ? " (... or any observable accessed during the remainder of the current run)" : "") + "\n\t" + getMessage("m038") + "\n"; + }; + return Reaction; +}(); +exports.Reaction = Reaction; +function registerErrorHandler(handler) { + invariant(this && this.$mobx && isReaction(this.$mobx), "Invalid `this`"); + invariant(!this.$mobx.errorHandler, "Only one onErrorHandler can be registered"); + this.$mobx.errorHandler = handler; +} +function onReactionError(handler) { + globalState.globalReactionErrorHandlers.push(handler); + return function () { + var idx = globalState.globalReactionErrorHandlers.indexOf(handler); + if (idx >= 0) globalState.globalReactionErrorHandlers.splice(idx, 1); + }; +} +var MAX_REACTION_ITERATIONS = 100; +var reactionScheduler = function reactionScheduler(f) { + return f(); +}; +function runReactions() { + if (globalState.inBatch > 0 || globalState.isRunningReactions) return; + reactionScheduler(runReactionsHelper); +} +function runReactionsHelper() { + globalState.isRunningReactions = true; + var allReactions = globalState.pendingReactions; + var iterations = 0; + while (allReactions.length > 0) { + if (++iterations === MAX_REACTION_ITERATIONS) { + console.error("Reaction doesn't converge to a stable state after " + MAX_REACTION_ITERATIONS + " iterations." + (" Probably there is a cycle in the reactive function: " + allReactions[0])); + allReactions.splice(0); + } + var remainingReactions = allReactions.splice(0); + for (var i = 0, l = remainingReactions.length; i < l; i++) { + remainingReactions[i].runReaction(); + } + } + globalState.isRunningReactions = false; +} +var isReaction = createInstanceofPredicate("Reaction", Reaction); +function setReactionScheduler(fn) { + var baseScheduler = reactionScheduler; + reactionScheduler = function reactionScheduler(f) { + return fn(function () { + return baseScheduler(f); + }); + }; +} +function isSpyEnabled() { + return !!globalState.spyListeners.length; +} +function spyReport(event) { + if (!globalState.spyListeners.length) return; + var listeners = globalState.spyListeners; + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i](event); + } +} +function spyReportStart(event) { + var change = objectAssign({}, event, { spyReportStart: true }); + spyReport(change); +} +var END_EVENT = { spyReportEnd: true }; +function spyReportEnd(change) { + if (change) spyReport(objectAssign({}, change, END_EVENT));else spyReport(END_EVENT); +} +function spy(listener) { + globalState.spyListeners.push(listener); + return once(function () { + var idx = globalState.spyListeners.indexOf(listener); + if (idx !== -1) globalState.spyListeners.splice(idx, 1); + }); +} +exports.spy = spy; +function hasInterceptors(interceptable) { + return interceptable.interceptors && interceptable.interceptors.length > 0; +} +function registerInterceptor(interceptable, handler) { + var interceptors = interceptable.interceptors || (interceptable.interceptors = []); + interceptors.push(handler); + return once(function () { + var idx = interceptors.indexOf(handler); + if (idx !== -1) interceptors.splice(idx, 1); + }); +} +function interceptChange(interceptable, change) { + var prevU = untrackedStart(); + try { + var interceptors = interceptable.interceptors; + if (interceptors) for (var i = 0, l = interceptors.length; i < l; i++) { + change = interceptors[i](change); + invariant(!change || change.type, "Intercept handlers should return nothing or a change object"); + if (!change) break; + } + return change; + } finally { + untrackedEnd(prevU); + } +} +function hasListeners(listenable) { + return listenable.changeListeners && listenable.changeListeners.length > 0; +} +function registerListener(listenable, handler) { + var listeners = listenable.changeListeners || (listenable.changeListeners = []); + listeners.push(handler); + return once(function () { + var idx = listeners.indexOf(handler); + if (idx !== -1) listeners.splice(idx, 1); + }); +} +function notifyListeners(listenable, change) { + var prevU = untrackedStart(); + var listeners = listenable.changeListeners; + if (!listeners) return; + listeners = listeners.slice(); + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i](change); + } + untrackedEnd(prevU); +} +function asReference(value) { + deprecated("asReference is deprecated, use observable.ref instead"); + return observable.ref(value); +} +exports.asReference = asReference; +function asStructure(value) { + deprecated("asStructure is deprecated. Use observable.struct, computed.struct or reaction options instead."); + return observable.struct(value); +} +exports.asStructure = asStructure; +function asFlat(value) { + deprecated("asFlat is deprecated, use observable.shallow instead"); + return observable.shallow(value); +} +exports.asFlat = asFlat; +function asMap(data) { + deprecated("asMap is deprecated, use observable.map or observable.shallowMap instead"); + return observable.map(data || {}); +} +exports.asMap = asMap; +function isModifierDescriptor(thing) { + return (typeof thing === "undefined" ? "undefined" : _typeof(thing)) === "object" && thing !== null && thing.isMobxModifierDescriptor === true; +} +exports.isModifierDescriptor = isModifierDescriptor; +function createModifierDescriptor(enhancer, initialValue) { + invariant(!isModifierDescriptor(initialValue), "Modifiers cannot be nested"); + return { + isMobxModifierDescriptor: true, + initialValue: initialValue, + enhancer: enhancer + }; +} +function deepEnhancer(v, _, name) { + if (isModifierDescriptor(v)) fail("You tried to assign a modifier wrapped value to a collection, please define modifiers when creating the collection, not when modifying it"); + if (isObservable(v)) return v; + if (Array.isArray(v)) return observable.array(v, name); + if (isPlainObject(v)) return observable.object(v, name); + if (isES6Map(v)) return observable.map(v, name); + return v; +} +function shallowEnhancer(v, _, name) { + if (isModifierDescriptor(v)) fail("You tried to assign a modifier wrapped value to a collection, please define modifiers when creating the collection, not when modifying it"); + if (v === undefined || v === null) return v; + if (isObservableObject(v) || isObservableArray(v) || isObservableMap(v)) return v; + if (Array.isArray(v)) return observable.shallowArray(v, name); + if (isPlainObject(v)) return observable.shallowObject(v, name); + if (isES6Map(v)) return observable.shallowMap(v, name); + return fail("The shallow modifier / decorator can only used in combination with arrays, objects and maps"); +} +function referenceEnhancer(newValue) { + return newValue; +} +function deepStructEnhancer(v, oldValue, name) { + if (deepEqual(v, oldValue)) return oldValue; + if (isObservable(v)) return v; + if (Array.isArray(v)) return new ObservableArray(v, deepStructEnhancer, name); + if (isES6Map(v)) return new ObservableMap(v, deepStructEnhancer, name); + if (isPlainObject(v)) { + var res = {}; + asObservableObject(res, name); + extendObservableHelper(res, deepStructEnhancer, [v]); + return res; + } + return v; +} +function refStructEnhancer(v, oldValue, name) { + if (deepEqual(v, oldValue)) return oldValue; + return v; +} +var MAX_SPLICE_SIZE = 10000; +var safariPrototypeSetterInheritanceBug = function () { + var v = false; + var p = {}; + Object.defineProperty(p, "0", { set: function set() { + v = true; + } }); + Object.create(p)["0"] = 1; + return v === false; +}(); +var OBSERVABLE_ARRAY_BUFFER_SIZE = 0; +var StubArray = function () { + function StubArray() {} + return StubArray; +}(); +StubArray.prototype = []; +var ObservableArrayAdministration = function () { + function ObservableArrayAdministration(name, enhancer, array, owned) { + this.array = array; + this.owned = owned; + this.lastKnownLength = 0; + this.interceptors = null; + this.changeListeners = null; + this.atom = new BaseAtom(name || "ObservableArray@" + getNextId()); + this.enhancer = function (newV, oldV) { + return enhancer(newV, oldV, name + "[..]"); + }; + } + ObservableArrayAdministration.prototype.intercept = function (handler) { + return registerInterceptor(this, handler); + }; + ObservableArrayAdministration.prototype.observe = function (listener, fireImmediately) { + if (fireImmediately === void 0) { + fireImmediately = false; + } + if (fireImmediately) { + listener({ + object: this.array, + type: "splice", + index: 0, + added: this.values.slice(), + addedCount: this.values.length, + removed: [], + removedCount: 0 + }); + } + return registerListener(this, listener); + }; + ObservableArrayAdministration.prototype.getArrayLength = function () { + this.atom.reportObserved(); + return this.values.length; + }; + ObservableArrayAdministration.prototype.setArrayLength = function (newLength) { + if (typeof newLength !== "number" || newLength < 0) throw new Error("[mobx.array] Out of range: " + newLength); + var currentLength = this.values.length; + if (newLength === currentLength) return;else if (newLength > currentLength) { + var newItems = new Array(newLength - currentLength); + for (var i = 0; i < newLength - currentLength; i++) { + newItems[i] = undefined; + }this.spliceWithArray(currentLength, 0, newItems); + } else this.spliceWithArray(newLength, currentLength - newLength); + }; + ObservableArrayAdministration.prototype.updateArrayLength = function (oldLength, delta) { + if (oldLength !== this.lastKnownLength) throw new Error("[mobx] Modification exception: the internal structure of an observable array was changed. Did you use peek() to change it?"); + this.lastKnownLength += delta; + if (delta > 0 && oldLength + delta + 1 > OBSERVABLE_ARRAY_BUFFER_SIZE) reserveArrayBuffer(oldLength + delta + 1); + }; + ObservableArrayAdministration.prototype.spliceWithArray = function (index, deleteCount, newItems) { + var _this = this; + checkIfStateModificationsAreAllowed(this.atom); + var length = this.values.length; + if (index === undefined) index = 0;else if (index > length) index = length;else if (index < 0) index = Math.max(0, length + index); + if (arguments.length === 1) deleteCount = length - index;else if (deleteCount === undefined || deleteCount === null) deleteCount = 0;else deleteCount = Math.max(0, Math.min(deleteCount, length - index)); + if (newItems === undefined) newItems = []; + if (hasInterceptors(this)) { + var change = interceptChange(this, { + object: this.array, + type: "splice", + index: index, + removedCount: deleteCount, + added: newItems + }); + if (!change) return EMPTY_ARRAY; + deleteCount = change.removedCount; + newItems = change.added; + } + newItems = newItems.map(function (v) { + return _this.enhancer(v, undefined); + }); + var lengthDelta = newItems.length - deleteCount; + this.updateArrayLength(length, lengthDelta); + var res = this.spliceItemsIntoValues(index, deleteCount, newItems); + if (deleteCount !== 0 || newItems.length !== 0) this.notifyArraySplice(index, newItems, res); + return res; + }; + ObservableArrayAdministration.prototype.spliceItemsIntoValues = function (index, deleteCount, newItems) { + if (newItems.length < MAX_SPLICE_SIZE) { + return (_a = this.values).splice.apply(_a, [index, deleteCount].concat(newItems)); + } else { + var res = this.values.slice(index, index + deleteCount); + this.values = this.values.slice(0, index).concat(newItems, this.values.slice(index + deleteCount)); + return res; + } + var _a; + }; + ObservableArrayAdministration.prototype.notifyArrayChildUpdate = function (index, newValue, oldValue) { + var notifySpy = !this.owned && isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + object: this.array, + type: "update", + index: index, newValue: newValue, oldValue: oldValue + } : null; + if (notifySpy) spyReportStart(change); + this.atom.reportChanged(); + if (notify) notifyListeners(this, change); + if (notifySpy) spyReportEnd(); + }; + ObservableArrayAdministration.prototype.notifyArraySplice = function (index, added, removed) { + var notifySpy = !this.owned && isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + object: this.array, + type: "splice", + index: index, removed: removed, added: added, + removedCount: removed.length, + addedCount: added.length + } : null; + if (notifySpy) spyReportStart(change); + this.atom.reportChanged(); + if (notify) notifyListeners(this, change); + if (notifySpy) spyReportEnd(); + }; + return ObservableArrayAdministration; +}(); +var ObservableArray = function (_super) { + __extends(ObservableArray, _super); + function ObservableArray(initialValues, enhancer, name, owned) { + if (name === void 0) { + name = "ObservableArray@" + getNextId(); + } + if (owned === void 0) { + owned = false; + } + var _this = _super.call(this) || this; + var adm = new ObservableArrayAdministration(name, enhancer, _this, owned); + addHiddenFinalProp(_this, "$mobx", adm); + if (initialValues && initialValues.length) { + adm.updateArrayLength(0, initialValues.length); + adm.values = initialValues.map(function (v) { + return enhancer(v, undefined, name + "[..]"); + }); + adm.notifyArraySplice(0, adm.values.slice(), EMPTY_ARRAY); + } else { + adm.values = []; + } + if (safariPrototypeSetterInheritanceBug) { + Object.defineProperty(adm.array, "0", ENTRY_0); + } + return _this; + } + ObservableArray.prototype.intercept = function (handler) { + return this.$mobx.intercept(handler); + }; + ObservableArray.prototype.observe = function (listener, fireImmediately) { + if (fireImmediately === void 0) { + fireImmediately = false; + } + return this.$mobx.observe(listener, fireImmediately); + }; + ObservableArray.prototype.clear = function () { + return this.splice(0); + }; + ObservableArray.prototype.concat = function () { + var arrays = []; + for (var _i = 0; _i < arguments.length; _i++) { + arrays[_i] = arguments[_i]; + } + this.$mobx.atom.reportObserved(); + return Array.prototype.concat.apply(this.peek(), arrays.map(function (a) { + return isObservableArray(a) ? a.peek() : a; + })); + }; + ObservableArray.prototype.replace = function (newItems) { + return this.$mobx.spliceWithArray(0, this.$mobx.values.length, newItems); + }; + ObservableArray.prototype.toJS = function () { + return this.slice(); + }; + ObservableArray.prototype.toJSON = function () { + return this.toJS(); + }; + ObservableArray.prototype.peek = function () { + return this.$mobx.values; + }; + ObservableArray.prototype.find = function (predicate, thisArg, fromIndex) { + if (fromIndex === void 0) { + fromIndex = 0; + } + this.$mobx.atom.reportObserved(); + var items = this.$mobx.values, + l = items.length; + for (var i = fromIndex; i < l; i++) { + if (predicate.call(thisArg, items[i], i, this)) return items[i]; + }return undefined; + }; + ObservableArray.prototype.splice = function (index, deleteCount) { + var newItems = []; + for (var _i = 2; _i < arguments.length; _i++) { + newItems[_i - 2] = arguments[_i]; + } + switch (arguments.length) { + case 0: + return []; + case 1: + return this.$mobx.spliceWithArray(index); + case 2: + return this.$mobx.spliceWithArray(index, deleteCount); + } + return this.$mobx.spliceWithArray(index, deleteCount, newItems); + }; + ObservableArray.prototype.spliceWithArray = function (index, deleteCount, newItems) { + return this.$mobx.spliceWithArray(index, deleteCount, newItems); + }; + ObservableArray.prototype.push = function () { + var items = []; + for (var _i = 0; _i < arguments.length; _i++) { + items[_i] = arguments[_i]; + } + var adm = this.$mobx; + adm.spliceWithArray(adm.values.length, 0, items); + return adm.values.length; + }; + ObservableArray.prototype.pop = function () { + return this.splice(Math.max(this.$mobx.values.length - 1, 0), 1)[0]; + }; + ObservableArray.prototype.shift = function () { + return this.splice(0, 1)[0]; + }; + ObservableArray.prototype.unshift = function () { + var items = []; + for (var _i = 0; _i < arguments.length; _i++) { + items[_i] = arguments[_i]; + } + var adm = this.$mobx; + adm.spliceWithArray(0, 0, items); + return adm.values.length; + }; + ObservableArray.prototype.reverse = function () { + this.$mobx.atom.reportObserved(); + var clone = this.slice(); + return clone.reverse.apply(clone, arguments); + }; + ObservableArray.prototype.sort = function (compareFn) { + this.$mobx.atom.reportObserved(); + var clone = this.slice(); + return clone.sort.apply(clone, arguments); + }; + ObservableArray.prototype.remove = function (value) { + var idx = this.$mobx.values.indexOf(value); + if (idx > -1) { + this.splice(idx, 1); + return true; + } + return false; + }; + ObservableArray.prototype.move = function (fromIndex, toIndex) { + function checkIndex(index) { + if (index < 0) { + throw new Error("[mobx.array] Index out of bounds: " + index + " is negative"); + } + var length = this.$mobx.values.length; + if (index >= length) { + throw new Error("[mobx.array] Index out of bounds: " + index + " is not smaller than " + length); + } + } + checkIndex.call(this, fromIndex); + checkIndex.call(this, toIndex); + if (fromIndex === toIndex) { + return; + } + var oldItems = this.$mobx.values; + var newItems; + if (fromIndex < toIndex) { + newItems = oldItems.slice(0, fromIndex).concat(oldItems.slice(fromIndex + 1, toIndex + 1), [oldItems[fromIndex]], oldItems.slice(toIndex + 1)); + } else { + newItems = oldItems.slice(0, toIndex).concat([oldItems[fromIndex]], oldItems.slice(toIndex, fromIndex), oldItems.slice(fromIndex + 1)); + } + this.replace(newItems); + }; + ObservableArray.prototype.toString = function () { + this.$mobx.atom.reportObserved(); + return Array.prototype.toString.apply(this.$mobx.values, arguments); + }; + ObservableArray.prototype.toLocaleString = function () { + this.$mobx.atom.reportObserved(); + return Array.prototype.toLocaleString.apply(this.$mobx.values, arguments); + }; + return ObservableArray; +}(StubArray); +declareIterator(ObservableArray.prototype, function () { + return arrayAsIterator(this.slice()); +}); +makeNonEnumerable(ObservableArray.prototype, ["constructor", "intercept", "observe", "clear", "concat", "replace", "toJS", "toJSON", "peek", "find", "splice", "spliceWithArray", "push", "pop", "shift", "unshift", "reverse", "sort", "remove", "move", "toString", "toLocaleString"]); +Object.defineProperty(ObservableArray.prototype, "length", { + enumerable: false, + configurable: true, + get: function get() { + return this.$mobx.getArrayLength(); + }, + set: function set(newLength) { + this.$mobx.setArrayLength(newLength); + } +}); +["every", "filter", "forEach", "indexOf", "join", "lastIndexOf", "map", "reduce", "reduceRight", "slice", "some"].forEach(function (funcName) { + var baseFunc = Array.prototype[funcName]; + invariant(typeof baseFunc === "function", "Base function not defined on Array prototype: '" + funcName + "'"); + addHiddenProp(ObservableArray.prototype, funcName, function () { + this.$mobx.atom.reportObserved(); + return baseFunc.apply(this.$mobx.values, arguments); + }); +}); +var ENTRY_0 = { + configurable: true, + enumerable: false, + set: createArraySetter(0), + get: createArrayGetter(0) +}; +function createArrayBufferItem(index) { + var set = createArraySetter(index); + var get = createArrayGetter(index); + Object.defineProperty(ObservableArray.prototype, "" + index, { + enumerable: false, + configurable: true, + set: set, get: get + }); +} +function createArraySetter(index) { + return function (newValue) { + var adm = this.$mobx; + var values = adm.values; + if (index < values.length) { + checkIfStateModificationsAreAllowed(adm.atom); + var oldValue = values[index]; + if (hasInterceptors(adm)) { + var change = interceptChange(adm, { + type: "update", + object: adm.array, + index: index, newValue: newValue + }); + if (!change) return; + newValue = change.newValue; + } + newValue = adm.enhancer(newValue, oldValue); + var changed = newValue !== oldValue; + if (changed) { + values[index] = newValue; + adm.notifyArrayChildUpdate(index, newValue, oldValue); + } + } else if (index === values.length) { + adm.spliceWithArray(index, 0, [newValue]); + } else throw new Error("[mobx.array] Index out of bounds, " + index + " is larger than " + values.length); + }; +} +function createArrayGetter(index) { + return function () { + var impl = this.$mobx; + if (impl) { + if (index < impl.values.length) { + impl.atom.reportObserved(); + return impl.values[index]; + } + console.warn("[mobx.array] Attempt to read an array index (" + index + ") that is out of bounds (" + impl.values.length + "). Please check length first. Out of bound indices will not be tracked by MobX"); + } + return undefined; + }; +} +function reserveArrayBuffer(max) { + for (var index = OBSERVABLE_ARRAY_BUFFER_SIZE; index < max; index++) { + createArrayBufferItem(index); + }OBSERVABLE_ARRAY_BUFFER_SIZE = max; +} +reserveArrayBuffer(1000); +var isObservableArrayAdministration = createInstanceofPredicate("ObservableArrayAdministration", ObservableArrayAdministration); +function isObservableArray(thing) { + return isObject(thing) && isObservableArrayAdministration(thing.$mobx); +} +exports.isObservableArray = isObservableArray; +var ObservableMapMarker = {}; +var ObservableMap = function () { + function ObservableMap(initialData, enhancer, name) { + if (enhancer === void 0) { + enhancer = deepEnhancer; + } + if (name === void 0) { + name = "ObservableMap@" + getNextId(); + } + this.enhancer = enhancer; + this.name = name; + this.$mobx = ObservableMapMarker; + this._data = {}; + this._hasMap = {}; + this._keys = new ObservableArray(undefined, referenceEnhancer, this.name + ".keys()", true); + this.interceptors = null; + this.changeListeners = null; + this.merge(initialData); + } + ObservableMap.prototype._has = function (key) { + return typeof this._data[key] !== "undefined"; + }; + ObservableMap.prototype.has = function (key) { + if (!this.isValidKey(key)) return false; + key = "" + key; + if (this._hasMap[key]) return this._hasMap[key].get(); + return this._updateHasMapEntry(key, false).get(); + }; + ObservableMap.prototype.set = function (key, value) { + this.assertValidKey(key); + key = "" + key; + var hasKey = this._has(key); + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: hasKey ? "update" : "add", + object: this, + newValue: value, + name: key + }); + if (!change) return this; + value = change.newValue; + } + if (hasKey) { + this._updateValue(key, value); + } else { + this._addValue(key, value); + } + return this; + }; + ObservableMap.prototype.delete = function (key) { + var _this = this; + this.assertValidKey(key); + key = "" + key; + if (hasInterceptors(this)) { + var change = interceptChange(this, { + type: "delete", + object: this, + name: key + }); + if (!change) return false; + } + if (this._has(key)) { + var notifySpy = isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + type: "delete", + object: this, + oldValue: this._data[key].value, + name: key + } : null; + if (notifySpy) spyReportStart(change); + runInTransaction(function () { + _this._keys.remove(key); + _this._updateHasMapEntry(key, false); + var observable = _this._data[key]; + observable.setNewValue(undefined); + _this._data[key] = undefined; + }); + if (notify) notifyListeners(this, change); + if (notifySpy) spyReportEnd(); + return true; + } + return false; + }; + ObservableMap.prototype._updateHasMapEntry = function (key, value) { + var entry = this._hasMap[key]; + if (entry) { + entry.setNewValue(value); + } else { + entry = this._hasMap[key] = new ObservableValue(value, referenceEnhancer, this.name + "." + key + "?", false); + } + return entry; + }; + ObservableMap.prototype._updateValue = function (name, newValue) { + var observable = this._data[name]; + newValue = observable.prepareNewValue(newValue); + if (newValue !== UNCHANGED) { + var notifySpy = isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + type: "update", + object: this, + oldValue: observable.value, + name: name, newValue: newValue + } : null; + if (notifySpy) spyReportStart(change); + observable.setNewValue(newValue); + if (notify) notifyListeners(this, change); + if (notifySpy) spyReportEnd(); + } + }; + ObservableMap.prototype._addValue = function (name, newValue) { + var _this = this; + runInTransaction(function () { + var observable = _this._data[name] = new ObservableValue(newValue, _this.enhancer, _this.name + "." + name, false); + newValue = observable.value; + _this._updateHasMapEntry(name, true); + _this._keys.push(name); + }); + var notifySpy = isSpyEnabled(); + var notify = hasListeners(this); + var change = notify || notifySpy ? { + type: "add", + object: this, + name: name, newValue: newValue + } : null; + if (notifySpy) spyReportStart(change); + if (notify) notifyListeners(this, change); + if (notifySpy) spyReportEnd(); + }; + ObservableMap.prototype.get = function (key) { + key = "" + key; + if (this.has(key)) return this._data[key].get(); + return undefined; + }; + ObservableMap.prototype.keys = function () { + return arrayAsIterator(this._keys.slice()); + }; + ObservableMap.prototype.values = function () { + return arrayAsIterator(this._keys.map(this.get, this)); + }; + ObservableMap.prototype.entries = function () { + var _this = this; + return arrayAsIterator(this._keys.map(function (key) { + return [key, _this.get(key)]; + })); + }; + ObservableMap.prototype.forEach = function (callback, thisArg) { + var _this = this; + this.keys().forEach(function (key) { + return callback.call(thisArg, _this.get(key), key, _this); + }); + }; + ObservableMap.prototype.merge = function (other) { + var _this = this; + if (isObservableMap(other)) { + other = other.toJS(); + } + runInTransaction(function () { + if (isPlainObject(other)) Object.keys(other).forEach(function (key) { + return _this.set(key, other[key]); + });else if (Array.isArray(other)) other.forEach(function (_a) { + var key = _a[0], + value = _a[1]; + return _this.set(key, value); + });else if (isES6Map(other)) other.forEach(function (value, key) { + return _this.set(key, value); + });else if (other !== null && other !== undefined) fail("Cannot initialize map from " + other); + }); + return this; + }; + ObservableMap.prototype.clear = function () { + var _this = this; + runInTransaction(function () { + untracked(function () { + _this.keys().forEach(_this.delete, _this); + }); + }); + }; + ObservableMap.prototype.replace = function (values) { + var _this = this; + runInTransaction(function () { + _this.clear(); + _this.merge(values); + }); + return this; + }; + Object.defineProperty(ObservableMap.prototype, "size", { + get: function get() { + return this._keys.length; + }, + enumerable: true, + configurable: true + }); + ObservableMap.prototype.toJS = function () { + var _this = this; + var res = {}; + this.keys().forEach(function (key) { + return res[key] = _this.get(key); + }); + return res; + }; + ObservableMap.prototype.toJSON = function () { + return this.toJS(); + }; + ObservableMap.prototype.isValidKey = function (key) { + if (key === null || key === undefined) return false; + if (typeof key === "string" || typeof key === "number" || typeof key === "boolean") return true; + return false; + }; + ObservableMap.prototype.assertValidKey = function (key) { + if (!this.isValidKey(key)) throw new Error("[mobx.map] Invalid key: '" + key + "', only strings, numbers and booleans are accepted as key in observable maps."); + }; + ObservableMap.prototype.toString = function () { + var _this = this; + return this.name + "[{ " + this.keys().map(function (key) { + return key + ": " + ("" + _this.get(key)); + }).join(", ") + " }]"; + }; + ObservableMap.prototype.observe = function (listener, fireImmediately) { + invariant(fireImmediately !== true, getMessage("m033")); + return registerListener(this, listener); + }; + ObservableMap.prototype.intercept = function (handler) { + return registerInterceptor(this, handler); + }; + return ObservableMap; +}(); +exports.ObservableMap = ObservableMap; +declareIterator(ObservableMap.prototype, function () { + return this.entries(); +}); +function map(initialValues) { + deprecated("`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map` instead"); + return observable.map(initialValues); +} +exports.map = map; +var isObservableMap = createInstanceofPredicate("ObservableMap", ObservableMap); +exports.isObservableMap = isObservableMap; +var ObservableObjectAdministration = function () { + function ObservableObjectAdministration(target, name) { + this.target = target; + this.name = name; + this.values = {}; + this.changeListeners = null; + this.interceptors = null; + } + ObservableObjectAdministration.prototype.observe = function (callback, fireImmediately) { + invariant(fireImmediately !== true, "`observe` doesn't support the fire immediately property for observable objects."); + return registerListener(this, callback); + }; + ObservableObjectAdministration.prototype.intercept = function (handler) { + return registerInterceptor(this, handler); + }; + return ObservableObjectAdministration; +}(); +function asObservableObject(target, name) { + if (isObservableObject(target)) return target.$mobx; + invariant(Object.isExtensible(target), getMessage("m035")); + if (!isPlainObject(target)) name = (target.constructor.name || "ObservableObject") + "@" + getNextId(); + if (!name) name = "ObservableObject@" + getNextId(); + var adm = new ObservableObjectAdministration(target, name); + addHiddenFinalProp(target, "$mobx", adm); + return adm; +} +function defineObservablePropertyFromDescriptor(adm, propName, descriptor, defaultEnhancer) { + if (adm.values[propName]) { + invariant("value" in descriptor, "The property " + propName + " in " + adm.name + " is already observable, cannot redefine it as computed property"); + adm.target[propName] = descriptor.value; + return; + } + if ("value" in descriptor) { + if (isModifierDescriptor(descriptor.value)) { + var modifierDescriptor = descriptor.value; + defineObservableProperty(adm, propName, modifierDescriptor.initialValue, modifierDescriptor.enhancer); + } else if (isAction(descriptor.value) && descriptor.value.autoBind === true) { + defineBoundAction(adm.target, propName, descriptor.value.originalFn); + } else if (isComputedValue(descriptor.value)) { + defineComputedPropertyFromComputedValue(adm, propName, descriptor.value); + } else { + defineObservableProperty(adm, propName, descriptor.value, defaultEnhancer); + } + } else { + defineComputedProperty(adm, propName, descriptor.get, descriptor.set, false, true); + } +} +function defineObservableProperty(adm, propName, newValue, enhancer) { + assertPropertyConfigurable(adm.target, propName); + if (hasInterceptors(adm)) { + var change = interceptChange(adm, { + object: adm.target, + name: propName, + type: "add", + newValue: newValue + }); + if (!change) return; + newValue = change.newValue; + } + var observable = adm.values[propName] = new ObservableValue(newValue, enhancer, adm.name + "." + propName, false); + newValue = observable.value; + Object.defineProperty(adm.target, propName, generateObservablePropConfig(propName)); + notifyPropertyAddition(adm, adm.target, propName, newValue); +} +function defineComputedProperty(adm, propName, getter, setter, compareStructural, asInstanceProperty) { + if (asInstanceProperty) assertPropertyConfigurable(adm.target, propName); + adm.values[propName] = new ComputedValue(getter, adm.target, compareStructural, adm.name + "." + propName, setter); + if (asInstanceProperty) { + Object.defineProperty(adm.target, propName, generateComputedPropConfig(propName)); + } +} +function defineComputedPropertyFromComputedValue(adm, propName, computedValue) { + var name = adm.name + "." + propName; + computedValue.name = name; + if (!computedValue.scope) computedValue.scope = adm.target; + adm.values[propName] = computedValue; + Object.defineProperty(adm.target, propName, generateComputedPropConfig(propName)); +} +var observablePropertyConfigs = {}; +var computedPropertyConfigs = {}; +function generateObservablePropConfig(propName) { + return observablePropertyConfigs[propName] || (observablePropertyConfigs[propName] = { + configurable: true, + enumerable: true, + get: function get() { + return this.$mobx.values[propName].get(); + }, + set: function set(v) { + setPropertyValue(this, propName, v); + } + }); +} +function generateComputedPropConfig(propName) { + return computedPropertyConfigs[propName] || (computedPropertyConfigs[propName] = { + configurable: true, + enumerable: false, + get: function get() { + return this.$mobx.values[propName].get(); + }, + set: function set(v) { + return this.$mobx.values[propName].set(v); + } + }); +} +function setPropertyValue(instance, name, newValue) { + var adm = instance.$mobx; + var observable = adm.values[name]; + if (hasInterceptors(adm)) { + var change = interceptChange(adm, { + type: "update", + object: instance, + name: name, newValue: newValue + }); + if (!change) return; + newValue = change.newValue; + } + newValue = observable.prepareNewValue(newValue); + if (newValue !== UNCHANGED) { + var notify = hasListeners(adm); + var notifySpy = isSpyEnabled(); + var change = notify || notifySpy ? { + type: "update", + object: instance, + oldValue: observable.value, + name: name, newValue: newValue + } : null; + if (notifySpy) spyReportStart(change); + observable.setNewValue(newValue); + if (notify) notifyListeners(adm, change); + if (notifySpy) spyReportEnd(); + } +} +function notifyPropertyAddition(adm, object, name, newValue) { + var notify = hasListeners(adm); + var notifySpy = isSpyEnabled(); + var change = notify || notifySpy ? { + type: "add", + object: object, name: name, newValue: newValue + } : null; + if (notifySpy) spyReportStart(change); + if (notify) notifyListeners(adm, change); + if (notifySpy) spyReportEnd(); +} +var isObservableObjectAdministration = createInstanceofPredicate("ObservableObjectAdministration", ObservableObjectAdministration); +function isObservableObject(thing) { + if (isObject(thing)) { + runLazyInitializers(thing); + return isObservableObjectAdministration(thing.$mobx); + } + return false; +} +exports.isObservableObject = isObservableObject; +var UNCHANGED = {}; +var ObservableValue = function (_super) { + __extends(ObservableValue, _super); + function ObservableValue(value, enhancer, name, notifySpy) { + if (name === void 0) { + name = "ObservableValue@" + getNextId(); + } + if (notifySpy === void 0) { + notifySpy = true; + } + var _this = _super.call(this, name) || this; + _this.enhancer = enhancer; + _this.hasUnreportedChange = false; + _this.value = enhancer(value, undefined, name); + if (notifySpy && isSpyEnabled()) { + spyReport({ type: "create", object: _this, newValue: _this.value }); + } + return _this; + } + ObservableValue.prototype.set = function (newValue) { + var oldValue = this.value; + newValue = this.prepareNewValue(newValue); + if (newValue !== UNCHANGED) { + var notifySpy = isSpyEnabled(); + if (notifySpy) { + spyReportStart({ + type: "update", + object: this, + newValue: newValue, oldValue: oldValue + }); + } + this.setNewValue(newValue); + if (notifySpy) spyReportEnd(); + } + }; + ObservableValue.prototype.prepareNewValue = function (newValue) { + checkIfStateModificationsAreAllowed(this); + if (hasInterceptors(this)) { + var change = interceptChange(this, { object: this, type: "update", newValue: newValue }); + if (!change) return UNCHANGED; + newValue = change.newValue; + } + newValue = this.enhancer(newValue, this.value, this.name); + return this.value !== newValue ? newValue : UNCHANGED; + }; + ObservableValue.prototype.setNewValue = function (newValue) { + var oldValue = this.value; + this.value = newValue; + this.reportChanged(); + if (hasListeners(this)) { + notifyListeners(this, { + type: "update", + object: this, + newValue: newValue, + oldValue: oldValue + }); + } + }; + ObservableValue.prototype.get = function () { + this.reportObserved(); + return this.value; + }; + ObservableValue.prototype.intercept = function (handler) { + return registerInterceptor(this, handler); + }; + ObservableValue.prototype.observe = function (listener, fireImmediately) { + if (fireImmediately) listener({ + object: this, + type: "update", + newValue: this.value, + oldValue: undefined + }); + return registerListener(this, listener); + }; + ObservableValue.prototype.toJSON = function () { + return this.get(); + }; + ObservableValue.prototype.toString = function () { + return this.name + "[" + this.value + "]"; + }; + ObservableValue.prototype.valueOf = function () { + return toPrimitive(this.get()); + }; + return ObservableValue; +}(BaseAtom); +ObservableValue.prototype[primitiveSymbol()] = ObservableValue.prototype.valueOf; +var isObservableValue = createInstanceofPredicate("ObservableValue", ObservableValue); +exports.isBoxedObservable = isObservableValue; +function getAtom(thing, property) { + if ((typeof thing === "undefined" ? "undefined" : _typeof(thing)) === "object" && thing !== null) { + if (isObservableArray(thing)) { + invariant(property === undefined, getMessage("m036")); + return thing.$mobx.atom; + } + if (isObservableMap(thing)) { + var anyThing = thing; + if (property === undefined) return getAtom(anyThing._keys); + var observable_2 = anyThing._data[property] || anyThing._hasMap[property]; + invariant(!!observable_2, "the entry '" + property + "' does not exist in the observable map '" + getDebugName(thing) + "'"); + return observable_2; + } + runLazyInitializers(thing); + if (isObservableObject(thing)) { + if (!property) return fail("please specify a property"); + var observable_3 = thing.$mobx.values[property]; + invariant(!!observable_3, "no observable property '" + property + "' found on the observable object '" + getDebugName(thing) + "'"); + return observable_3; + } + if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) { + return thing; + } + } else if (typeof thing === "function") { + if (isReaction(thing.$mobx)) { + return thing.$mobx; + } + } + return fail("Cannot obtain atom from " + thing); +} +function getAdministration(thing, property) { + invariant(thing, "Expecting some object"); + if (property !== undefined) return getAdministration(getAtom(thing, property)); + if (isAtom(thing) || isComputedValue(thing) || isReaction(thing)) return thing; + if (isObservableMap(thing)) return thing; + runLazyInitializers(thing); + if (thing.$mobx) return thing.$mobx; + invariant(false, "Cannot obtain administration from " + thing); +} +function getDebugName(thing, property) { + var named; + if (property !== undefined) named = getAtom(thing, property);else if (isObservableObject(thing) || isObservableMap(thing)) named = getAdministration(thing);else named = getAtom(thing); + return named.name; +} +function createClassPropertyDecorator(onInitialize, _get, _set, enumerable, allowCustomArguments) { + function classPropertyDecorator(target, key, descriptor, customArgs, argLen) { + if (argLen === void 0) { + argLen = 0; + } + invariant(allowCustomArguments || quacksLikeADecorator(arguments), "This function is a decorator, but it wasn't invoked like a decorator"); + if (!descriptor) { + var newDescriptor = { + enumerable: enumerable, + configurable: true, + get: function get() { + if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) typescriptInitializeProperty(this, key, undefined, onInitialize, customArgs, descriptor); + return _get.call(this, key); + }, + set: function set(v) { + if (!this.__mobxInitializedProps || this.__mobxInitializedProps[key] !== true) { + typescriptInitializeProperty(this, key, v, onInitialize, customArgs, descriptor); + } else { + _set.call(this, key, v); + } + } + }; + if (arguments.length < 3 || arguments.length === 5 && argLen < 3) { + Object.defineProperty(target, key, newDescriptor); + } + return newDescriptor; + } else { + if (!hasOwnProperty(target, "__mobxLazyInitializers")) { + addHiddenProp(target, "__mobxLazyInitializers", target.__mobxLazyInitializers && target.__mobxLazyInitializers.slice() || []); + } + var value_1 = descriptor.value, + initializer_1 = descriptor.initializer; + target.__mobxLazyInitializers.push(function (instance) { + onInitialize(instance, key, initializer_1 ? initializer_1.call(instance) : value_1, customArgs, descriptor); + }); + return { + enumerable: enumerable, configurable: true, + get: function get() { + if (this.__mobxDidRunLazyInitializers !== true) runLazyInitializers(this); + return _get.call(this, key); + }, + set: function set(v) { + if (this.__mobxDidRunLazyInitializers !== true) runLazyInitializers(this); + _set.call(this, key, v); + } + }; + } + } + if (allowCustomArguments) { + return function () { + if (quacksLikeADecorator(arguments)) return classPropertyDecorator.apply(null, arguments); + var outerArgs = arguments; + var argLen = arguments.length; + return function (target, key, descriptor) { + return classPropertyDecorator(target, key, descriptor, outerArgs, argLen); + }; + }; + } + return classPropertyDecorator; +} +function typescriptInitializeProperty(instance, key, v, onInitialize, customArgs, baseDescriptor) { + if (!hasOwnProperty(instance, "__mobxInitializedProps")) addHiddenProp(instance, "__mobxInitializedProps", {}); + instance.__mobxInitializedProps[key] = true; + onInitialize(instance, key, v, customArgs, baseDescriptor); +} +function runLazyInitializers(instance) { + if (instance.__mobxDidRunLazyInitializers === true) return; + if (instance.__mobxLazyInitializers) { + addHiddenProp(instance, "__mobxDidRunLazyInitializers", true); + instance.__mobxDidRunLazyInitializers && instance.__mobxLazyInitializers.forEach(function (initializer) { + return initializer(instance); + }); + } +} +function quacksLikeADecorator(args) { + return (args.length === 2 || args.length === 3) && typeof args[1] === "string"; +} +function iteratorSymbol() { + return typeof Symbol === "function" && Symbol.iterator || "@@iterator"; +} +var IS_ITERATING_MARKER = "__$$iterating"; +function arrayAsIterator(array) { + invariant(array[IS_ITERATING_MARKER] !== true, "Illegal state: cannot recycle array as iterator"); + addHiddenFinalProp(array, IS_ITERATING_MARKER, true); + var idx = -1; + addHiddenFinalProp(array, "next", function next() { + idx++; + return { + done: idx >= this.length, + value: idx < this.length ? this[idx] : undefined + }; + }); + return array; +} +function declareIterator(prototType, iteratorFactory) { + addHiddenFinalProp(prototType, iteratorSymbol(), iteratorFactory); +} +var messages = { + "m001": "It is not allowed to assign new values to @action fields", + "m002": "`runInAction` expects a function", + "m003": "`runInAction` expects a function without arguments", + "m004": "autorun expects a function", + "m005": "Warning: attempted to pass an action to autorun. Actions are untracked and will not trigger on state changes. Use `reaction` or wrap only your state modification code in an action.", + "m006": "Warning: attempted to pass an action to autorunAsync. Actions are untracked and will not trigger on state changes. Use `reaction` or wrap only your state modification code in an action.", + "m007": "reaction only accepts 2 or 3 arguments. If migrating from MobX 2, please provide an options object", + "m008": "wrapping reaction expression in `asReference` is no longer supported, use options object instead", + "m009": "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'. It looks like it was used on a property.", + "m010": "@computed can only be used on getter functions, like: '@computed get myProps() { return ...; }'", + "m011": "First argument to `computed` should be an expression. If using computed as decorator, don't pass it arguments", + "m012": "computed takes one or two arguments if used as function", + "m013": "[mobx.expr] 'expr' should only be used inside other reactive functions.", + "m014": "extendObservable expected 2 or more arguments", + "m015": "extendObservable expects an object as first argument", + "m016": "extendObservable should not be used on maps, use map.merge instead", + "m017": "all arguments of extendObservable should be objects", + "m018": "extending an object with another observable (object) is not supported. Please construct an explicit propertymap, using `toJS` if need. See issue #540", + "m019": "[mobx.isObservable] isObservable(object, propertyName) is not supported for arrays and maps. Use map.has or array.length instead.", + "m020": "modifiers can only be used for individual object properties", + "m021": "observable expects zero or one arguments", + "m022": "@observable can not be used on getters, use @computed instead", + "m023": "Using `transaction` is deprecated, use `runInAction` or `(@)action` instead.", + "m024": "whyRun() can only be used if a derivation is active, or by passing an computed value / reaction explicitly. If you invoked whyRun from inside a computation; the computation is currently suspended but re-evaluating because somebody requested its value.", + "m025": "whyRun can only be used on reactions and computed values", + "m026": "`action` can only be invoked on functions", + "m028": "It is not allowed to set `useStrict` when a derivation is running", + "m029": "INTERNAL ERROR only onBecomeUnobserved shouldn't be called twice in a row", + "m030a": "Since strict-mode is enabled, changing observed observable values outside actions is not allowed. Please wrap the code in an `action` if this change is intended. Tried to modify: ", + "m030b": "Side effects like changing state are not allowed at this point. Are you trying to modify state from, for example, the render function of a React component? Tried to modify: ", + "m031": "Computed values are not allowed to not cause side effects by changing observables that are already being observed. Tried to modify: ", + "m032": "* This computation is suspended (not in use by any reaction) and won't run automatically.\n Didn't expect this computation to be suspended at this point?\n 1. Make sure this computation is used by a reaction (reaction, autorun, observer).\n 2. Check whether you are using this computation synchronously (in the same stack as they reaction that needs it).", + "m033": "`observe` doesn't support the fire immediately property for observable maps.", + "m034": "`mobx.map` is deprecated, use `new ObservableMap` or `mobx.observable.map` instead", + "m035": "Cannot make the designated object observable; it is not extensible", + "m036": "It is not possible to get index atoms from arrays", + "m037": "Hi there! I'm sorry you have just run into an exception.\nIf your debugger ends up here, know that some reaction (like the render() of an observer component, autorun or reaction)\nthrew an exception and that mobx caught it, to avoid that it brings the rest of your application down.\nThe original cause of the exception (the code that caused this reaction to run (again)), is still in the stack.\n\nHowever, more interesting is the actual stack trace of the error itself.\nHopefully the error is an instanceof Error, because in that case you can inspect the original stack of the error from where it was thrown.\nSee `error.stack` property, or press the very subtle \"(...)\" link you see near the console.error message that probably brought you here.\nThat stack is more interesting than the stack of this console.error itself.\n\nIf the exception you see is an exception you created yourself, make sure to use `throw new Error(\"Oops\")` instead of `throw \"Oops\"`,\nbecause the javascript environment will only preserve the original stack trace in the first form.\n\nYou can also make sure the debugger pauses the next time this very same exception is thrown by enabling \"Pause on caught exception\".\n(Note that it might pause on many other, unrelated exception as well).\n\nIf that all doesn't help you out, feel free to open an issue https://github.com/mobxjs/mobx/issues!\n", + "m038": "Missing items in this list?\n 1. Check whether all used values are properly marked as observable (use isObservable to verify)\n 2. Make sure you didn't dereference values too early. MobX observes props, not primitives. E.g: use 'person.name' instead of 'name' in your computation.\n" +}; +function getMessage(id) { + return messages[id]; +} +var EMPTY_ARRAY = []; +Object.freeze(EMPTY_ARRAY); +function getGlobal() { + return global; +} +function getNextId() { + return ++globalState.mobxGuid; +} +function fail(message, thing) { + invariant(false, message, thing); + throw "X"; +} +function invariant(check, message, thing) { + if (!check) throw new Error("[mobx] Invariant failed: " + message + (thing ? " in '" + thing + "'" : "")); +} +var deprecatedMessages = []; +function deprecated(msg) { + if (deprecatedMessages.indexOf(msg) !== -1) return false; + deprecatedMessages.push(msg); + console.error("[mobx] Deprecated: " + msg); + return true; +} +function once(func) { + var invoked = false; + return function () { + if (invoked) return; + invoked = true; + return func.apply(this, arguments); + }; +} +var noop = function noop() {}; +function unique(list) { + var res = []; + list.forEach(function (item) { + if (res.indexOf(item) === -1) res.push(item); + }); + return res; +} +function joinStrings(things, limit, separator) { + if (limit === void 0) { + limit = 100; + } + if (separator === void 0) { + separator = " - "; + } + if (!things) return ""; + var sliced = things.slice(0, limit); + return "" + sliced.join(separator) + (things.length > limit ? " (... and " + (things.length - limit) + "more)" : ""); +} +function isObject(value) { + return value !== null && (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object"; +} +function isPlainObject(value) { + if (value === null || (typeof value === "undefined" ? "undefined" : _typeof(value)) !== "object") return false; + var proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; +} +function objectAssign() { + var res = arguments[0]; + for (var i = 1, l = arguments.length; i < l; i++) { + var source = arguments[i]; + for (var key in source) { + if (hasOwnProperty(source, key)) { + res[key] = source[key]; + } + } + } + return res; +} +function valueDidChange(compareStructural, oldValue, newValue) { + if (typeof oldValue === 'number' && isNaN(oldValue)) { + return typeof newValue !== 'number' || !isNaN(newValue); + } + return compareStructural ? !deepEqual(oldValue, newValue) : oldValue !== newValue; +} +var prototypeHasOwnProperty = Object.prototype.hasOwnProperty; +function hasOwnProperty(object, propName) { + return prototypeHasOwnProperty.call(object, propName); +} +function makeNonEnumerable(object, propNames) { + for (var i = 0; i < propNames.length; i++) { + addHiddenProp(object, propNames[i], object[propNames[i]]); + } +} +function addHiddenProp(object, propName, value) { + Object.defineProperty(object, propName, { + enumerable: false, + writable: true, + configurable: true, + value: value + }); +} +function addHiddenFinalProp(object, propName, value) { + Object.defineProperty(object, propName, { + enumerable: false, + writable: false, + configurable: true, + value: value + }); +} +function isPropertyConfigurable(object, prop) { + var descriptor = Object.getOwnPropertyDescriptor(object, prop); + return !descriptor || descriptor.configurable !== false && descriptor.writable !== false; +} +function assertPropertyConfigurable(object, prop) { + invariant(isPropertyConfigurable(object, prop), "Cannot make property '" + prop + "' observable, it is not configurable and writable in the target object"); +} +function getEnumerableKeys(obj) { + var res = []; + for (var key in obj) { + res.push(key); + }return res; +} +function deepEqual(a, b) { + if (a === null && b === null) return true; + if (a === undefined && b === undefined) return true; + if ((typeof a === "undefined" ? "undefined" : _typeof(a)) !== "object") return a === b; + var aIsArray = isArrayLike(a); + var aIsMap = isMapLike(a); + if (aIsArray !== isArrayLike(b)) { + return false; + } else if (aIsMap !== isMapLike(b)) { + return false; + } else if (aIsArray) { + if (a.length !== b.length) return false; + for (var i = a.length - 1; i >= 0; i--) { + if (!deepEqual(a[i], b[i])) return false; + }return true; + } else if (aIsMap) { + if (a.size !== b.size) return false; + var equals_1 = true; + a.forEach(function (value, key) { + equals_1 = equals_1 && deepEqual(b.get(key), value); + }); + return equals_1; + } else if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object" && (typeof b === "undefined" ? "undefined" : _typeof(b)) === "object") { + if (a === null || b === null) return false; + if (isMapLike(a) && isMapLike(b)) { + if (a.size !== b.size) return false; + return deepEqual(observable.shallowMap(a).entries(), observable.shallowMap(b).entries()); + } + if (getEnumerableKeys(a).length !== getEnumerableKeys(b).length) return false; + for (var prop in a) { + if (!(prop in b)) return false; + if (!deepEqual(a[prop], b[prop])) return false; + } + return true; + } + return false; +} +function createInstanceofPredicate(name, clazz) { + var propName = "isMobX" + name; + clazz.prototype[propName] = true; + return function (x) { + return isObject(x) && x[propName] === true; + }; +} +function isArrayLike(x) { + return Array.isArray(x) || isObservableArray(x); +} +exports.isArrayLike = isArrayLike; +function isMapLike(x) { + return isES6Map(x) || isObservableMap(x); +} +function isES6Map(thing) { + if (getGlobal().Map !== undefined && thing instanceof getGlobal().Map) return true; + return false; +} +function primitiveSymbol() { + return typeof Symbol === "function" && Symbol.toPrimitive || "@@toPrimitive"; +} +function toPrimitive(value) { + return value === null ? null : (typeof value === "undefined" ? "undefined" : _typeof(value)) === "object" ? "" + value : value; +} +/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(4))) + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +var _icons = __webpack_require__(6); + +var _constants = __webpack_require__(0); + +function renderHeader(_ref, instance) { + var meta = _ref.meta, + user = _ref.user, + reactions = _ref.reactions; + + var container = document.createElement('div'); + container.lang = "en-US"; + container.className = 'gitment-container gitment-header-container'; + + var likeButton = document.createElement('span'); + var likedReaction = reactions.find(function (reaction) { + return reaction.content === 'heart' && reaction.user.login === user.login; + }); + likeButton.className = 'gitment-header-like-btn'; + likeButton.innerHTML = '\n ' + _icons.heart + '\n ' + (likedReaction ? 'Unlike' : 'Like') + '\n ' + (meta.reactions && meta.reactions.heart ? ' \u2022 ' + meta.reactions.heart + ' Liked' : '') + '\n '; + + if (likedReaction) { + likeButton.classList.add('liked'); + likeButton.onclick = function () { + return instance.unlike(); + }; + } else { + likeButton.classList.remove('liked'); + likeButton.onclick = function () { + return instance.like(); + }; + } + container.appendChild(likeButton); + + var commentsCount = document.createElement('span'); + commentsCount.innerHTML = '\n ' + (meta.comments ? ' \u2022 ' + meta.comments + ' Comments' : '') + '\n '; + container.appendChild(commentsCount); + + var issueLink = document.createElement('a'); + issueLink.className = 'gitment-header-issue-link'; + issueLink.href = meta.html_url; + issueLink.target = '_blank'; + issueLink.innerText = 'Issue Page'; + container.appendChild(issueLink); + + return container; +} + +function renderComments(_ref2, instance) { + var meta = _ref2.meta, + comments = _ref2.comments, + commentReactions = _ref2.commentReactions, + currentPage = _ref2.currentPage, + user = _ref2.user, + error = _ref2.error; + + var container = document.createElement('div'); + container.lang = "en-US"; + container.className = 'gitment-container gitment-comments-container'; + + if (error) { + var errorBlock = document.createElement('div'); + errorBlock.className = 'gitment-comments-error'; + + if (error === _constants.NOT_INITIALIZED_ERROR && user.login && user.login.toLowerCase() === instance.owner.toLowerCase()) { + var initHint = document.createElement('div'); + var initButton = document.createElement('button'); + initButton.className = 'gitment-comments-init-btn'; + initButton.onclick = function () { + initButton.setAttribute('disabled', true); + instance.init().catch(function (e) { + initButton.removeAttribute('disabled'); + alert(e); + }); + }; + initButton.innerText = 'Initialize Comments'; + initHint.appendChild(initButton); + errorBlock.appendChild(initHint); + } else { + errorBlock.innerText = error; + } + container.appendChild(errorBlock); + return container; + } else if (comments === undefined) { + var loading = document.createElement('div'); + loading.innerText = 'Loading comments...'; + loading.className = 'gitment-comments-loading'; + container.appendChild(loading); + return container; + } else if (!comments.length) { + var emptyBlock = document.createElement('div'); + emptyBlock.className = 'gitment-comments-empty'; + emptyBlock.innerText = 'No Comment Yet'; + container.appendChild(emptyBlock); + return container; + } + + var commentsList = document.createElement('ul'); + commentsList.className = 'gitment-comments-list'; + + comments.forEach(function (comment) { + var createDate = new Date(comment.created_at); + var updateDate = new Date(comment.updated_at); + var commentItem = document.createElement('li'); + commentItem.className = 'gitment-comment'; + commentItem.innerHTML = '\n \n \n \n
    \n
    \n \n ' + comment.user.login + '\n \n commented on\n ' + createDate.toDateString() + '\n ' + (createDate.toString() !== updateDate.toString() ? ' \u2022 edited' : '') + '\n
    ' + _icons.heart + ' ' + (comment.reactions.heart || '') + '
    \n
    \n
    ' + comment.body_html + '
    \n
    \n '; + var likeButton = commentItem.querySelector('.gitment-comment-like-btn'); + var likedReaction = commentReactions[comment.id] && commentReactions[comment.id].find(function (reaction) { + return reaction.content === 'heart' && reaction.user.login === user.login; + }); + if (likedReaction) { + likeButton.classList.add('liked'); + likeButton.onclick = function () { + return instance.unlikeAComment(comment.id); + }; + } else { + likeButton.classList.remove('liked'); + likeButton.onclick = function () { + return instance.likeAComment(comment.id); + }; + } + + // dirty + // use a blank image to trigger height calculating when element rendered + var imgTrigger = document.createElement('img'); + var markdownBody = commentItem.querySelector('.gitment-comment-body'); + imgTrigger.className = 'gitment-hidden'; + imgTrigger.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + imgTrigger.onload = function () { + if (markdownBody.clientHeight > instance.maxCommentHeight) { + markdownBody.classList.add('gitment-comment-body-folded'); + markdownBody.style.maxHeight = instance.maxCommentHeight + 'px'; + markdownBody.title = 'Click to Expand'; + markdownBody.onclick = function () { + markdownBody.classList.remove('gitment-comment-body-folded'); + markdownBody.style.maxHeight = ''; + markdownBody.title = ''; + markdownBody.onclick = null; + }; + } + }; + commentItem.appendChild(imgTrigger); + + commentsList.appendChild(commentItem); + }); + + container.appendChild(commentsList); + + if (meta) { + var pageCount = Math.ceil(meta.comments / instance.perPage); + if (pageCount > 1) { + var pagination = document.createElement('ul'); + pagination.className = 'gitment-comments-pagination'; + + if (currentPage > 1) { + var previousButton = document.createElement('li'); + previousButton.className = 'gitment-comments-page-item'; + previousButton.innerText = 'Previous'; + previousButton.onclick = function () { + return instance.goto(currentPage - 1); + }; + pagination.appendChild(previousButton); + } + + var _loop = function _loop(i) { + var pageItem = document.createElement('li'); + pageItem.className = 'gitment-comments-page-item'; + pageItem.innerText = i; + pageItem.onclick = function () { + return instance.goto(i); + }; + if (currentPage === i) pageItem.classList.add('gitment-selected'); + pagination.appendChild(pageItem); + }; + + for (var i = 1; i <= pageCount; i++) { + _loop(i); + } + + if (currentPage < pageCount) { + var nextButton = document.createElement('li'); + nextButton.className = 'gitment-comments-page-item'; + nextButton.innerText = 'Next'; + nextButton.onclick = function () { + return instance.goto(currentPage + 1); + }; + pagination.appendChild(nextButton); + } + + container.appendChild(pagination); + } + } + + return container; +} + +function renderEditor(_ref3, instance) { + var user = _ref3.user, + error = _ref3.error; + + var container = document.createElement('div'); + container.lang = "en-US"; + container.className = 'gitment-container gitment-editor-container'; + + var shouldDisable = user.login && !error ? '' : 'disabled'; + var disabledTip = user.login ? '' : 'Login to Comment'; + container.innerHTML = '\n ' + (user.login ? '\n \n ' : user.isLoggingIn ? '
    ' + _icons.spinner + '
    ' : '\n ' + _icons.github + '\n ') + '\n \n
    \n
    \n \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n
    \n
    \n \n '; + if (user.login) { + container.querySelector('.gitment-editor-logout-link').onclick = function () { + return instance.logout(); + }; + } + + var writeField = container.querySelector('.gitment-editor-write-field'); + var previewField = container.querySelector('.gitment-editor-preview-field'); + + var textarea = writeField.querySelector('textarea'); + textarea.oninput = function () { + textarea.style.height = 'auto'; + var style = window.getComputedStyle(textarea, null); + var height = parseInt(style.height, 10); + var clientHeight = textarea.clientHeight; + var scrollHeight = textarea.scrollHeight; + if (clientHeight < scrollHeight) { + textarea.style.height = height + scrollHeight - clientHeight + 'px'; + } + }; + + var _container$querySelec = container.querySelectorAll('.gitment-editor-tab'), + _container$querySelec2 = _slicedToArray(_container$querySelec, 2), + writeTab = _container$querySelec2[0], + previewTab = _container$querySelec2[1]; + + writeTab.onclick = function () { + writeTab.classList.add('gitment-selected'); + previewTab.classList.remove('gitment-selected'); + writeField.classList.remove('gitment-hidden'); + previewField.classList.add('gitment-hidden'); + + textarea.focus(); + }; + previewTab.onclick = function () { + previewTab.classList.add('gitment-selected'); + writeTab.classList.remove('gitment-selected'); + previewField.classList.remove('gitment-hidden'); + writeField.classList.add('gitment-hidden'); + + var preview = previewField.querySelector('.gitment-editor-preview'); + var content = textarea.value.trim(); + if (!content) { + preview.innerText = 'Nothing to preview'; + return; + } + + preview.innerText = 'Loading preview...'; + instance.markdown(content).then(function (html) { + return preview.innerHTML = html; + }); + }; + + var submitButton = container.querySelector('.gitment-editor-submit'); + submitButton.onclick = function () { + submitButton.innerText = 'Submitting...'; + submitButton.setAttribute('disabled', true); + instance.post(textarea.value.trim()).then(function (data) { + textarea.value = ''; + textarea.style.height = 'auto'; + submitButton.removeAttribute('disabled'); + submitButton.innerText = 'Comment'; + }).catch(function (e) { + alert(e); + submitButton.removeAttribute('disabled'); + submitButton.innerText = 'Comment'; + }); + }; + + return container; +} + +function renderFooter() { + var container = document.createElement('div'); + container.lang = "en-US"; + container.className = 'gitment-container gitment-footer-container'; + container.innerHTML = '\n Powered by\n \n Gitment\n \n '; + return container; +} + +function render(state, instance) { + var container = document.createElement('div'); + container.lang = "en-US"; + container.className = 'gitment-container gitment-root-container'; + container.appendChild(instance.renderHeader(state, instance)); + container.appendChild(instance.renderComments(state, instance)); + container.appendChild(instance.renderEditor(state, instance)); + container.appendChild(instance.renderFooter(state, instance)); + return container; +} + +exports.default = { render: render, renderHeader: renderHeader, renderComments: renderComments, renderEditor: renderEditor, renderFooter: renderFooter }; + +/***/ }), +/* 3 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.http = exports.Query = exports.isString = undefined; + +var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); + +exports.getTargetContainer = getTargetContainer; + +var _constants = __webpack_require__(0); + +var isString = exports.isString = function isString(s) { + return toString.call(s) === '[object String]'; +}; + +function getTargetContainer(container) { + var targetContainer = void 0; + if (container instanceof Element) { + targetContainer = container; + } else if (isString(container)) { + targetContainer = document.getElementById(container); + } else { + targetContainer = document.createElement('div'); + } + + return targetContainer; +} + +var Query = exports.Query = { + parse: function parse() { + var search = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window.location.search; + + if (!search) return {}; + var queryString = search[0] === '?' ? search.substring(1) : search; + var query = {}; + queryString.split('&').forEach(function (queryStr) { + var _queryStr$split = queryStr.split('='), + _queryStr$split2 = _slicedToArray(_queryStr$split, 2), + key = _queryStr$split2[0], + value = _queryStr$split2[1]; + + if (key) query[key] = value; + }); + + return query; + }, + stringify: function stringify(query) { + var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '?'; + + var queryString = Object.keys(query).map(function (key) { + return key + '=' + encodeURIComponent(query[key] || ''); + }).join('&'); + return queryString ? prefix + queryString : ''; + } +}; + +function ajaxFactory(method) { + return function (apiPath) { + var data = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var base = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'https://api.github.com'; + + var req = new XMLHttpRequest(); + var token = localStorage.getItem(_constants.LS_ACCESS_TOKEN_KEY); + + var url = '' + base + apiPath; + var body = null; + if (method === 'GET' || method === 'DELETE') { + url += Query.stringify(data); + } + + var p = new Promise(function (resolve, reject) { + req.addEventListener('load', function () { + var contentType = req.getResponseHeader('content-type'); + var res = req.responseText; + if (!/json/.test(contentType)) { + resolve(res); + return; + } + var data = req.responseText ? JSON.parse(res) : {}; + if (data.message) { + reject(new Error(data.message)); + } else { + resolve(data); + } + }); + req.addEventListener('error', function (error) { + return reject(error); + }); + }); + req.open(method, url, true); + + req.setRequestHeader('Accept', 'application/vnd.github.squirrel-girl-preview, application/vnd.github.html+json'); + if (token) { + req.setRequestHeader('Authorization', 'token ' + token); + } + if (method !== 'GET' && method !== 'DELETE') { + body = JSON.stringify(data); + req.setRequestHeader('Content-Type', 'application/json'); + } + + req.send(body); + return p; + }; +} + +var http = exports.http = { + get: ajaxFactory('GET'), + post: ajaxFactory('POST'), + delete: ajaxFactory('DELETE'), + put: ajaxFactory('PUT') +}; + +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +var g; + +// This works in non-strict mode +g = function () { + return this; +}(); + +try { + // This works if eval is allowed (see CSP) + g = g || Function("return this")() || (1, eval)("this"); +} catch (e) { + // This works if the window reference is available + if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === "object") g = window; +} + +// g can still be undefined, but nothing to do about it... +// We return undefined, instead of nothing here, so it's +// easier to handle this case. if(!global) { ...} + +module.exports = g; + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); + +var _mobx = __webpack_require__(1); + +var _constants = __webpack_require__(0); + +var _utils = __webpack_require__(3); + +var _default = __webpack_require__(2); + +var _default2 = _interopRequireDefault(_default); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } + +var scope = 'public_repo'; + +function extendRenderer(instance, renderer) { + instance[renderer] = function (container) { + var targetContainer = (0, _utils.getTargetContainer)(container); + var render = instance.theme[renderer] || instance.defaultTheme[renderer]; + + (0, _mobx.autorun)(function () { + var e = render(instance.state, instance); + if (targetContainer.firstChild) { + targetContainer.replaceChild(e, targetContainer.firstChild); + } else { + targetContainer.appendChild(e); + } + }); + + return targetContainer; + }; +} + +var Gitment = function () { + _createClass(Gitment, [{ + key: 'accessToken', + get: function get() { + return localStorage.getItem(_constants.LS_ACCESS_TOKEN_KEY); + }, + set: function set(token) { + localStorage.setItem(_constants.LS_ACCESS_TOKEN_KEY, token); + } + }, { + key: 'loginLink', + get: function get() { + var oauthUri = 'https://github.com/login/oauth/authorize'; + var redirect_uri = this.oauth.redirect_uri || window.location.href; + + var oauthParams = Object.assign({ + scope: scope, + redirect_uri: redirect_uri + }, this.oauth); + + return '' + oauthUri + _utils.Query.stringify(oauthParams); + } + }]); + + function Gitment() { + var _this = this; + + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + _classCallCheck(this, Gitment); + + this.defaultTheme = _default2.default; + this.useTheme(_default2.default); + + Object.assign(this, { + id: window.location.href, + title: window.document.title, + link: window.location.href, + desc: '', + labels: [], + theme: _default2.default, + oauth: {}, + perPage: 20, + maxCommentHeight: 250 + }, options); + + this.useTheme(this.theme); + + var user = {}; + try { + var userInfo = localStorage.getItem(_constants.LS_USER_KEY); + if (this.accessToken && userInfo) { + Object.assign(user, JSON.parse(userInfo), { + fromCache: true + }); + } + } catch (e) { + localStorage.removeItem(_constants.LS_USER_KEY); + } + + this.state = (0, _mobx.observable)({ + user: user, + error: null, + meta: {}, + comments: undefined, + reactions: [], + commentReactions: {}, + currentPage: 1 + }); + + var query = _utils.Query.parse(); + if (query.code) { + var _oauth = this.oauth, + client_id = _oauth.client_id, + client_secret = _oauth.client_secret; + + var code = query.code; + delete query.code; + var search = _utils.Query.stringify(query); + var replacedUrl = '' + window.location.origin + window.location.pathname + search + window.location.hash; + history.replaceState({}, '', replacedUrl); + + Object.assign(this, { + id: replacedUrl, + link: replacedUrl + }, options); + + this.state.user.isLoggingIn = true; + _utils.http.post('https://gh-oauth.imsun.net', { + code: code, + client_id: client_id, + client_secret: client_secret + }, '').then(function (data) { + _this.accessToken = data.access_token; + _this.update(); + }).catch(function (e) { + _this.state.user.isLoggingIn = false; + alert(e); + }); + } else { + this.update(); + } + } + + _createClass(Gitment, [{ + key: 'init', + value: function init() { + var _this2 = this; + + return this.createIssue().then(function () { + return _this2.loadComments(); + }).then(function (comments) { + _this2.state.error = null; + return comments; + }); + } + }, { + key: 'useTheme', + value: function useTheme() { + var _this3 = this; + + var theme = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + this.theme = theme; + + var renderers = Object.keys(this.theme); + renderers.forEach(function (renderer) { + return extendRenderer(_this3, renderer); + }); + } + }, { + key: 'update', + value: function update() { + var _this4 = this; + + return Promise.all([this.loadMeta(), this.loadUserInfo()]).then(function () { + return Promise.all([_this4.loadComments().then(function () { + return _this4.loadCommentReactions(); + }), _this4.loadReactions()]); + }).catch(function (e) { + return _this4.state.error = e; + }); + } + }, { + key: 'markdown', + value: function markdown(text) { + return _utils.http.post('/markdown', { + text: text, + mode: 'gfm' + }); + } + }, { + key: 'createIssue', + value: function createIssue() { + var _this5 = this; + + var id = this.id, + owner = this.owner, + repo = this.repo, + title = this.title, + link = this.link, + desc = this.desc, + labels = this.labels; + + + return _utils.http.post('/repos/' + owner + '/' + repo + '/issues', { + title: title, + labels: labels.concat(['gitment', id]), + body: link + '\n\n' + desc + }).then(function (meta) { + _this5.state.meta = meta; + return meta; + }); + } + }, { + key: 'getIssue', + value: function getIssue() { + if (this.state.meta.id) return Promise.resolve(this.state.meta); + + return this.loadMeta(); + } + }, { + key: 'post', + value: function post(body) { + var _this6 = this; + + return this.getIssue().then(function (issue) { + return _utils.http.post(issue.comments_url, { body: body }, ''); + }).then(function (data) { + _this6.state.meta.comments++; + var pageCount = Math.ceil(_this6.state.meta.comments / _this6.perPage); + if (_this6.state.currentPage === pageCount) { + _this6.state.comments.push(data); + } + return data; + }); + } + }, { + key: 'loadMeta', + value: function loadMeta() { + var _this7 = this; + + var id = this.id, + owner = this.owner, + repo = this.repo; + + return _utils.http.get('/repos/' + owner + '/' + repo + '/issues', { + creator: owner, + labels: id + }).then(function (issues) { + if (!issues.length) return Promise.reject(_constants.NOT_INITIALIZED_ERROR); + _this7.state.meta = issues[0]; + return issues[0]; + }); + } + }, { + key: 'loadComments', + value: function loadComments() { + var _this8 = this; + + var page = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.currentPage; + + return this.getIssue().then(function (issue) { + return _utils.http.get(issue.comments_url, { page: page, per_page: _this8.perPage }, ''); + }).then(function (comments) { + _this8.state.comments = comments; + return comments; + }); + } + }, { + key: 'loadUserInfo', + value: function loadUserInfo() { + var _this9 = this; + + if (!this.accessToken) { + this.logout(); + return Promise.resolve({}); + } + + return _utils.http.get('/user').then(function (user) { + _this9.state.user = user; + localStorage.setItem(_constants.LS_USER_KEY, JSON.stringify(user)); + return user; + }); + } + }, { + key: 'loadReactions', + value: function loadReactions() { + var _this10 = this; + + if (!this.accessToken) { + this.state.reactions = []; + return Promise.resolve([]); + } + + return this.getIssue().then(function (issue) { + if (!issue.reactions.total_count) return []; + return _utils.http.get(issue.reactions.url, {}, ''); + }).then(function (reactions) { + _this10.state.reactions = reactions; + return reactions; + }); + } + }, { + key: 'loadCommentReactions', + value: function loadCommentReactions() { + var _this11 = this; + + if (!this.accessToken) { + this.state.commentReactions = {}; + return Promise.resolve([]); + } + + var comments = this.state.comments; + var comentReactions = {}; + + return Promise.all(comments.map(function (comment) { + if (!comment.reactions.total_count) return []; + + var owner = _this11.owner, + repo = _this11.repo; + + return _utils.http.get('/repos/' + owner + '/' + repo + '/issues/comments/' + comment.id + '/reactions', {}); + })).then(function (reactionsArray) { + comments.forEach(function (comment, index) { + comentReactions[comment.id] = reactionsArray[index]; + }); + _this11.state.commentReactions = comentReactions; + + return comentReactions; + }); + } + }, { + key: 'login', + value: function login() { + window.location.href = this.loginLink; + } + }, { + key: 'logout', + value: function logout() { + localStorage.removeItem(_constants.LS_ACCESS_TOKEN_KEY); + localStorage.removeItem(_constants.LS_USER_KEY); + this.state.user = {}; + } + }, { + key: 'goto', + value: function goto(page) { + this.state.currentPage = page; + this.state.comments = undefined; + return this.loadComments(page); + } + }, { + key: 'like', + value: function like() { + var _this12 = this; + + if (!this.accessToken) { + alert('Login to Like'); + return Promise.reject(); + } + + var owner = this.owner, + repo = this.repo; + + + return _utils.http.post('/repos/' + owner + '/' + repo + '/issues/' + this.state.meta.number + '/reactions', { + content: 'heart' + }).then(function (reaction) { + _this12.state.reactions.push(reaction); + _this12.state.meta.reactions.heart++; + }); + } + }, { + key: 'unlike', + value: function unlike() { + var _this13 = this; + + if (!this.accessToken) return Promise.reject(); + + var _state = this.state, + user = _state.user, + reactions = _state.reactions; + + var index = reactions.findIndex(function (reaction) { + return reaction.user.login === user.login; + }); + return _utils.http.delete('/reactions/' + reactions[index].id).then(function () { + reactions.splice(index, 1); + _this13.state.meta.reactions.heart--; + }); + } + }, { + key: 'likeAComment', + value: function likeAComment(commentId) { + var _this14 = this; + + if (!this.accessToken) { + alert('Login to Like'); + return Promise.reject(); + } + + var owner = this.owner, + repo = this.repo; + + var comment = this.state.comments.find(function (comment) { + return comment.id === commentId; + }); + + return _utils.http.post('/repos/' + owner + '/' + repo + '/issues/comments/' + commentId + '/reactions', { + content: 'heart' + }).then(function (reaction) { + _this14.state.commentReactions[commentId].push(reaction); + comment.reactions.heart++; + }); + } + }, { + key: 'unlikeAComment', + value: function unlikeAComment(commentId) { + if (!this.accessToken) return Promise.reject(); + + var reactions = this.state.commentReactions[commentId]; + var comment = this.state.comments.find(function (comment) { + return comment.id === commentId; + }); + var user = this.state.user; + + var index = reactions.findIndex(function (reaction) { + return reaction.user.login === user.login; + }); + + return _utils.http.delete('/reactions/' + reactions[index].id).then(function () { + reactions.splice(index, 1); + comment.reactions.heart--; + }); + } + }]); + + return Gitment; +}(); + +module.exports = Gitment; + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +/** + * Modified from https://github.com/evil-icons/evil-icons + */ + +var close = exports.close = ''; +var github = exports.github = ''; +var heart = exports.heart = ''; +var spinner = exports.spinner = ''; + +/***/ }) +/******/ ]); +//# sourceMappingURL=gitment.browser.js.map \ No newline at end of file diff --git a/js/search.js b/js/search.js new file mode 100644 index 00000000..bba51fb4 --- /dev/null +++ b/js/search.js @@ -0,0 +1,86 @@ +var searchFunc = function(path, search_id, content_id) { + 'use strict'; + $.ajax({ + url: path, + dataType: "xml", + success: function( xmlResponse ) { + // get the contents from search data + var datas = $( "entry", xmlResponse ).map(function() { + return { + title: $( "title", this ).text(), + content: $("content",this).text(), + url: $( "url" , this).text() + }; + }).get(); + var $input = document.getElementById(search_id); + var $resultContent = document.getElementById(content_id); + $input.addEventListener('input', function(){ + var str='
      '; + var keywords = this.value.trim().toLowerCase().split(/[\s\-]+/); + $resultContent.innerHTML = ""; + if (this.value.trim().length <= 0) { + return; + } + // perform local searching + datas.forEach(function(data) { + var isMatch = true; + var content_index = []; + var data_title = data.title.trim().toLowerCase(); + var data_content = data.content.trim().replace(/<[^>]+>/g,"").toLowerCase(); + var data_url = data.url; + var index_title = -1; + var index_content = -1; + var first_occur = -1; + // only match artiles with not empty titles and contents + if(data_title != '' && data_content != '') { + keywords.forEach(function(keyword, i) { + index_title = data_title.indexOf(keyword); + index_content = data_content.indexOf(keyword); + if( index_title < 0 && index_content < 0 ){ + isMatch = false; + } else { + if (index_content < 0) { + index_content = 0; + } + if (i == 0) { + first_occur = index_content; + } + } + }); + } + // show search results + if (isMatch) { + str += "
    • "+ data_title +""; + var content = data.content.trim().replace(/<[^>]+>/g,""); + if (first_occur >= 0) { + // cut out 100 characters + var start = first_occur - 30; + var outLength = 78; + if(start < 0){ + start = 0; + } + if (start + outLength > content.length){ + if(content.length < outLength){ + outLength = content.length - start; + }else{ + start = content.length - outLength; + } + } + var match_content = content.substr(start, outLength); + // highlight all keywords + keywords.forEach(function(keyword){ + var regS = new RegExp(keyword, "gi"); + match_content = match_content.replace(regS, ""+keyword+""); + }); + + str += "

      " + match_content +"...

      " + } + str += "
    • "; + } + }); + str += "
    "; + $resultContent.innerHTML = str; + }); + } + }); +} diff --git a/js/share.js b/js/share.js new file mode 100644 index 00000000..f358213d --- /dev/null +++ b/js/share.js @@ -0,0 +1,60 @@ +(function($){ + + // article-share + $('body').on('click', function(){ + $('.article-share-box.on').removeClass('on'); + }).on('click', '.article-share-link', function(e){ + e.stopPropagation(); + + var $this = $(this), + url = $this.attr('data-url'), + qrcode_img = $this.attr('data-qrcode'), + encodedUrl = encodeURIComponent(url), + id = 'article-share-box-' + $this.attr('data-id'), + title = document.title, + offset = $this.offset(); + + if ($('#' + id).length){ + var box = $('#' + id); + + if (box.hasClass('on')){ + box.removeClass('on'); + return; + } + } else { + var html = [ + '
    ', + '', + '
    ', + '', + '', + '', + '', + '
    ', + '
    ', + '
    ' + ].join(''); + + var box = $(html); + + $('body').append(box); + } + + $('.article-share-box.on').hide(); + + box.css({ + top: offset.top + 25, + left: offset.left + }).addClass('on'); + }).on('click', '.article-share-box', function(e){ + e.stopPropagation(); + }).on('click', '.article-share-box-input', function(){ + $(this).select(); + }).on('click', '.article-share-box-link', function(e){ + e.preventDefault(); + e.stopPropagation(); + + window.open(this.href, 'article-share-box-window-' + Date.now(), 'width=500,height=450'); + }); + +})(jQuery); diff --git a/js/smartresize.js b/js/smartresize.js new file mode 100644 index 00000000..7def5e71 --- /dev/null +++ b/js/smartresize.js @@ -0,0 +1,32 @@ ++(function($, sr) { + // debouncing function from John Hann + // http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/ + var debounce = function(func, threshold, execAsap) { + var timeout; + + return function debounced() { + var obj = this, args = arguments; + + function delayed() { + if (!execAsap) { + func.apply(obj, args); + } + + timeout = null; + }; + + if (timeout) { + clearTimeout(timeout); + } + else if (execAsap) { + func.apply(obj, args); + } + + timeout = setTimeout(delayed, threshold || 100); + }; + }; + + jQuery.fn[sr] = function(fn) { + return fn ? this.bind('resize', debounce(fn)) : this.trigger(sr); + }; +})(jQuery, 'smartresize'); diff --git a/js/totop.js b/js/totop.js new file mode 100644 index 00000000..afa66d9a --- /dev/null +++ b/js/totop.js @@ -0,0 +1,12 @@ +$(window).scroll(function() { + $(window).scrollTop() > 500 ? $("#rocket").addClass("show") : $("#rocket").removeClass("show"); +}); +$("#rocket").click(function() { + $("#rocket").addClass("launch"); + $("html, body").animate({ + scrollTop: 0 + }, 500, function() { + $("#rocket").removeClass("show launch"); + }); + return false; +}); diff --git a/package.json b/package.json deleted file mode 100644 index 4e4eb591..00000000 --- a/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "hexo-site", - "version": "0.0.0", - "private": true, - "hexo": { - "version": "3.9.0" - }, - "scripts": { - "s": "hexo s -g", - "d": "hexo d -g" - }, - "dependencies": { - "hexo": "^3.7.0", - "hexo-abbrlink": "^2.0.5", - "hexo-deployer-git": "^0.3.1", - "hexo-generator-archive": "^0.1.5", - "hexo-generator-baidu-sitemap": "^0.1.6", - "hexo-generator-category": "^0.1.3", - "hexo-generator-feed": "^1.2.2", - "hexo-generator-index": "^0.2.1", - "hexo-generator-sitemap": "^1.2.0", - "hexo-generator-tag": "^0.2.0", - "hexo-renderer-ejs": "^0.3.1", - "hexo-renderer-marked": "^0.3.2", - "hexo-renderer-pug": "0.0.5", - "hexo-renderer-sass": "^0.3.2", - "hexo-renderer-stylus": "^0.3.3", - "hexo-server": "^0.3.1", - "hexo-wordcount": "^6.0.1", - "node-sass": "^4.13.1" - } -} diff --git a/page/2/index.html b/page/2/index.html new file mode 100644 index 00000000..87e580eb --- /dev/null +++ b/page/2/index.html @@ -0,0 +1,18 @@ +HackDApp | Focus on DApp tutorials, Thinking growth, Mac skills, IndieMaker, etc.

    零基础体验EOS入门合约开发

    本教程主要面向初阶开发人员,目的在于带领大家以最简单的示例合约,通过简单但不失完整的流程,体验整个合约的编译、发布与调用过程,从而让大家从直观角度有个清晰的概念认识。

    Read More

    巧用HistoryApiAction实现对链数据的存储与查询

    在开发EOS DApp智能合约时,我们都知道可以使用`multi\\_index\_`来对合约数据的存储与查询,但合约的存储是需要消耗一定的资源的,而且随着用户的增长往往会导业务数据会越来越大,从而导致合约需要更多的资源来支撑其数据增长。那么是否有一种更好的方式来降低某些场景的资源消耗呢?那么,今天将为你分享一种数据存储方案: 借用EOS链提供的`history_api_action\_`插件、`内部合约Action调用`来完成对业务数据的存储与查询。HackDApp愿与你分享!

    Read More

    使用EOS.js发布EOS智能合约

    之前我们曾经介绍过如何使用EOS的系统命令(cleos set contract)发布智能合约,那么今天将分享另外一种方式:使用eosjs-sdk发布合约。在此基础上,可以通过配置package.json脚本以及IDE快捷链,可以快速提升DApp开发效率。HackDApp愿与你分享!

    Read More

    剖析EOS合约编译ABI文件

    每个EOS合约开发者肯定都知道ABI文件,但却不一定都知道ABI内部属性是什么,具体作用。本文hackdapp将带你一探ABI究竟。HackDApp愿与你分享!

    Read More

    重塑思维:自律 VS 习惯

    本周最大的收获就是:搞清楚自律与习惯间的转换逻辑。明白靠自律去约束自己只能不断内耗意志力,相反如果通过打造系统逻辑,形成习惯便可从根本上提高效率。因为本身习惯不消耗意志力而是一种肌肉反应能力。HackDApp愿与你分享!

    Read More

    C++基础语法(EOS完全开发指南)

    Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

    +
    /* filename: myapp.cpp
    date: 2019-01-28 3:06 PM
    auth: zhangliang<zhangliang@cldy.org> */

    #include <iostream> //定义头文件
    #include <stdlib.h>

    int main()
    {
    using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string

    string msg = "hi, my first dapp"; //定义变量

    cout << msg <<endl; //打印字符串
    }

    //tryit: http://tpcg.io/Tulum1
    +

    以上代码便是C++最简单可运行的最小示例。基本包含了在程序结构中所必须的一些语言特性。

    +

    根据上述程序结构,我们可以大致将它拆分成五部分内容:

    Read More

    C++导读(EOS完全开发指南)

    Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org

    +

    本章节内容主要是带大家了解C++整个编程语言的体系架构,对C++编程语言有个整体的大致的认识与理解。另外,也是帮助大家在开发EOS智能合约之前做一下前期预习,易于对后面EOS合约的快速上手。

    +

    另外,需要说明的是,因为本身EOS智能合约是在一个沙箱机制中运行,所以它对一些标准函数库的方法进行了一些限制。所以可能导致大家可能在网上找的资料中的方法无法在合约中正常执行。

    Read More

    \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html new file mode 100644 index 00000000..0e2a2197 --- /dev/null +++ b/page/3/index.html @@ -0,0 +1,19 @@ +HackDApp | Focus on DApp tutorials, Thinking growth, Mac skills, IndieMaker, etc.

    坚持的长性

    +

    今天早上算是被媳妇嘲笑了一番,为啥呢?

    +

    因为之前自己有一段时间,为了背英语单词,所以早起了一个月,而如今早一天晚一天,早起完全看心情。

    Read More

    波场Tron-可快捷开发的实战工程模板

    本教程通过以自己定制的工程模板为示例,讲解工程构建、快捷键部署私链及整体完整的开发注程,并配以操作动图帮助大家理解。hackdapp愿与你分享。 HackDApp愿与你分享!

    Read More

    2019MetaLife

    新年愿意清单

    +
      +
    • 尝试每天500字,锻炼文字组织能力
    • +
    • 做一款自己的小众产品,用户达到100人
    • +
    • 尝试录制短视频

    Read More

    \ No newline at end of file diff --git a/source/robots.txt b/robots.txt similarity index 100% rename from source/robots.txt rename to robots.txt diff --git a/scaffolds/draft.md b/scaffolds/draft.md deleted file mode 100644 index 498e95ba..00000000 --- a/scaffolds/draft.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: {{ title }} -tags: ---- diff --git a/scaffolds/page.md b/scaffolds/page.md deleted file mode 100644 index f01ba3cd..00000000 --- a/scaffolds/page.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -title: {{ title }} -date: {{ date }} ---- diff --git a/scaffolds/post.md b/scaffolds/post.md deleted file mode 100644 index 65e2189b..00000000 --- a/scaffolds/post.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: {{ title }} -url: -date: {{ date }} -categories: 周报(2019) -tags: -keywords: ---- -## 见 - -## 感 - -## 思 - -## 行 diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..0b6cd16c --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,193 @@ + + + + + https://www.hackdapp.com/archives/how-to-impl-nft-proj.html + + 2021-06-28T15:33:38.116Z + + + + + https://www.hackdapp.com/archives/how-to-make-goodnotes.html + + 2021-06-07T09:29:04.609Z + + + + + https://www.hackdapp.com/archives/20210428-%E5%A6%82%E4%BD%95%E6%8F%90%E9%AB%98%E9%98%B2%E7%8C%9D%E6%AD%BB%E7%9A%84%E8%83%BD%E5%8A%9B.html + + 2021-04-28T15:08:39.509Z + + + + + https://www.hackdapp.com/archives/how_to_write_ad_fast.html + + 2021-04-07T12:28:02.909Z + + + + + https://www.hackdapp.com/archives/Sun%20Feb%2028%202021%2000:00:00%20GMT+0800%20(China%20Standard%20Time).html + + 2021-04-07T10:00:45.168Z + + + + + https://www.hackdapp.com/archives/how-to-improve-return-risk-ratio.html + + 2021-04-07T10:00:45.167Z + + + + + https://www.hackdapp.com/wiki/index.html + + 2021-04-07T09:31:42.563Z + + + + + https://www.hackdapp.com/weekly/index.html + + 2021-04-07T09:31:42.562Z + + + + + https://www.hackdapp.com/history/index.html + + 2021-04-07T09:31:42.561Z + + + + + https://www.hackdapp.com/things/index.html + + 2021-04-07T09:31:42.561Z + + + + + https://www.hackdapp.com/tools/index.html + + 2021-04-07T09:31:42.561Z + + + + + https://www.hackdapp.com/google1031035202c817c5.html + + 2021-04-07T09:31:42.560Z + + + + + https://www.hackdapp.com/grownth/index.html + + 2021-04-07T09:31:42.560Z + + + + + https://www.hackdapp.com/baidu_verify_3oa53OCFMq.html + + 2021-04-07T09:31:42.558Z + + + + + https://www.hackdapp.com/about/index.html + + 2021-04-07T09:31:42.558Z + + + + + https://www.hackdapp.com/edusmart/index.html + + 2021-04-07T09:31:42.558Z + + + + + https://www.hackdapp.com/archives/try_eoscontract_dev.html + + 2021-04-07T09:31:42.557Z + + + + + https://www.hackdapp.com/archives/simple_cpllus_code.html + + 2021-04-07T09:31:42.557Z + + + + + https://www.hackdapp.com/archives/eosdev_deploycontract_eosjs.html + + 2021-04-07T09:31:42.556Z + + + + + https://www.hackdapp.com/archives/eosdev_datastorage_historyaction.html + + 2021-04-07T09:31:42.556Z + + + + + https://www.hackdapp.com/archives/eosdev_cplus_intro.html + + 2021-04-07T09:31:42.555Z + + + + + https://www.hackdapp.com/archives/rebuildbrain_habit.html + + 2021-04-07T09:31:42.555Z + + + + + https://www.hackdapp.com/archives/eosdev_contract_abi.html + + 2021-04-07T09:31:42.555Z + + + + + https://www.hackdapp.com/archives/tron_boilerplate.html + + 2021-04-07T09:31:42.554Z + + + + + https://www.hackdapp.com/archives/think_habit.html + + 2021-04-07T09:31:42.554Z + + + + + https://www.hackdapp.com/archives/eosdev_cplus_basic.html + + 2021-04-07T09:31:42.554Z + + + + + https://www.hackdapp.com/archives/2019metalife.html + + 2021-04-07T09:31:42.553Z + + + + diff --git a/source/_drafts/2019-02-22.md b/source/_drafts/2019-02-22.md deleted file mode 100644 index 282be598..00000000 --- a/source/_drafts/2019-02-22.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -abbrlink: 1 ---- -# 基于EOS/Node.js的DApp项目实战---去中心化交易所 - -## 一、介绍 -### 1.1 去中心化交易所简介 -众所周知,在传统中心化交易所的选择上,用户往往最担心的就是资金安全问题,原本想通过投资赚钱却惨遭意外损失,所以会优先选用那些信用度较高且知名机构背书的交易所。 - -但在区块链行业发展初期, 很多兴起的TOKEN中心化交易所都是由一些初创型或者稍有名气但不足以完全信任的公司所运营, 所以提高了用户心理上的资金风险指数。而且通过过往发生的各种交易所事件,也佐证了交易所资金私自挪用、暗箱操作、黑客攻击等事件发生的可能性;除此之外,还要面临公司内部运营风险、交易不透明等问题。 - -与此同时, 随着区块链的进一步发展,出现了不同解决方案的去中化交易所, 用来解决中心化所带来的各种风险问题。其核心优势在于规避集中式资产管理, 用户对自己的资产拥有绝对的所有权与控制权,因此资产被盗的可能性极低,很大程度上降低了用户对交易所的信任成本。但由于资产的交易操作是由区块链来驱动的,所以也会受到区块确认速度的限制,近而影响用户体验。 -目前的商业典型案例有: EtherDela、0x、Kyber、Loopring、bitshares等。 - -### 1.2 项目介绍 -本项目是使用EOS、SmartContract、Node.js、React等技术架构, 采用链上搓合与资产清算的方案实现的去中心化交易所。 - -在交易所中, 用户可以直接使用自己的钱包进行帐号登录;然后使用自己的用户权限直接创建买/卖订单,而无需进行币种充值;当系统发现订单薄中存在符合搓合价格要求的订单后,则由系统直接进行搓合,并将搓合日志记录至区块链上;最后,由系统将搓合成功的部分或完全成交的TOKEN转帐到对方帐号地址。 - -另外,当系统调度发现链上存在成交日志时,会自动将成交记录同步至后端服务数据库,并同步更新K线图报表数据以及实时更新币价信息;最后,根据变动的信息数据, 通过socket服务将消息推送到前端展示页。 - -本系统核心业务逻辑主要是通过智能合约进行实现的, 其中包括搓合逻辑的处理、关键数据的定义、买卖单的创建以及订单薄的维护;而后端服务主要是以node.js技术进行功能实现,一方面用于与区块链的接口交互,比如:查询合约内数据以及链上区块数据;另一方面主要用于对外提供http及socket接口服务,通过整合业务数据及合约数据,以供前端页面的数据展示;除此之外,后端还有配套的调度服务,实时同步链上数据,并生成不同维度的报表数据。 - -### 1.3 项目详情 - -本项目从功能结构上,主要划分为六大模块: -- 基础数据管理; -- 订单管理 -- 搓合管理 -- 系统管理 -- 报表管理 -- 调度管理 - -**基础数据管理**,主要用于维护币种及交易对数据。 币种管理主要用于定义当前交易所所支持的币种, 比如币种名称, 合约名称及资金精度等;交易对管理主要用于定义基准代币可兑换的币种、交易对最小订单量以及手续费等信息; - -**订单管理**, 主要用于维护用户订单数据以及交易所订单薄数据。用户订单功能主要用于记录用户实时创建的买/卖单交易数据, 其中包括交易对、购买价格、订单量、订单状态等数据信息;而订单薄功能主要用于对交易所所有的订单按卖买类型进行分队列排序,从而方便展示当前交易对的交易深度以及供搓合功能处理; - -**搓合管理**, 主要用于实时将订单薄中符中搓合条件的订单进行数据处理,并同时更新用户订单数据以及资金清算等业务; - -**系统管理**, 主要用于维护交易所配置数据以及运营状态。比如,是否锁定或开启交易所; - -**调度管理**, 主要用于实时监控链上搓合成交记录,并实时同步订单数据至数据库,供前端K线图的数据展示; - -**报表管理**, 主要用于通过交易市场的交易情况实时展示K线图报表数据以及实时更新所有交易对币价信息, 比如:24小时成交量, 当前币种价格、涨跌幅等信息。 - -### 1. 4 技术需求 -要成功完成本项目开发, 您应该对以下语言有基本的了解: -- C/C++编程基础 - EOS智能合约本身是用C++语言进行编写的,所以需要对一些基础的数据类型、结构体、函数库有一些简单的了解; -- Docker容器 - 为了提供最佳的实践环境,考虑EOS链的搭建时间成本较高,所以使用Docker技术快速构建链环境,方便大家在开发过程对链环境的快速启动或还原; -- Node.js - Node主要用于链接前端页面与智能合约间的交互,其中包括: 调用合约方法、同步数据、提供服务接口等工作。 -- Jest - 为了保证功能在持续完善过程中,可能出现的各种不确定的代码影响。所以使用测试用例可以提高验证效率,降低代码bug风险。 - -### 1.5 涉及技术点 - -![](http://assets.processon.com/chart_image/5c6cee61e4b07fada4ec47a0.png) - -## 二、项目架构 - -![](http://assets.processon.com/chart_image/5c6ccd91e4b07fada4ec1a3a.png) - -## 三、业务流程图 - -![](http://assets.processon.com/chart_image/5c6e043ee4b056ae2a109843.png) - -## 四、实现步骤 -1. 配置运行环境及IDE工具: Git、Node、npm、vscode; -2. 配置工程环境; -3. 合约设计; 数据结构、接口定义; -4. 编写测试用例,对合约方法进行测试; -5. 封装智能合约SDK,供业务系统调用; -6. 使用Node-Express开发业务系统,并整合调度、数据库、日志、缓存、日期、多配置等组件服务; -7. 实现同步区块调度服务; -8. 实现同步区块数据至报表服务; -9. 实现对外HTTP服务接口; -10. 实现对外SOCKET服务接口; -11. 集成PM2守护启动线程; -12. 与前端界面对接接口并整体测试 -13. 项目发布与部署。发布合约至测试网或正式网, 启动前后端项目系统。 - -## 五、项目进度安排 - -![](http://assets.processon.com/chart_image/5c6baaf8e4b0fa03ceb804b2.png) - -## 五、项目成果展示 - -![](https://ws3.sinaimg.cn/large/006tKfTcly1g0cmwln6fzj315i0u00vk.jpg) - - diff --git "a/source/_drafts/\345\237\272\344\272\216Gitlab\345\277\253\351\200\237\346\236\204\345\273\272CI-CD\351\203\250\347\275\262-SSH\350\277\234\347\250\213\346\234\215\345\212\241\345\231\250\351\205\215\347\275\256\347\257\207.md" "b/source/_drafts/\345\237\272\344\272\216Gitlab\345\277\253\351\200\237\346\236\204\345\273\272CI-CD\351\203\250\347\275\262-SSH\350\277\234\347\250\213\346\234\215\345\212\241\345\231\250\351\205\215\347\275\256\347\257\207.md" deleted file mode 100644 index 26761f97..00000000 --- "a/source/_drafts/\345\237\272\344\272\216Gitlab\345\277\253\351\200\237\346\236\204\345\273\272CI-CD\351\203\250\347\275\262-SSH\350\277\234\347\250\213\346\234\215\345\212\241\345\231\250\351\205\215\347\275\256\347\257\207.md" +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: 基于Gitlab快速构建CI/CD部署--SSH远程服务器配置篇 -categories: tech -abbrlink: 3592 -date: 2021-04-14 09:45:05 -url: gitlab-ci-config-deploy-via-ssh -tags: -keywords: -- ci/cd ---- - -## Preview&目标 - -通过Gitlab中的CI/CD功能,实现SSH远程部署一个应用服务到指定服务器。 - -## 准备 - -- 1对公私钥匙, 用于通过SSH访问服务器使用; -- 1台服务器,用来部署我们的服务; -- 1个Gitlab帐户 - -## 开始 - -### 1. 新建demo工程 - -### 2. 生成公私钥匙 - -``` - -``` - -### 3. 配置公私钥变量 - - - -### 4. 设置CI/CD配置 - -### 5. 手动发布 diff --git a/source/_posts/20190108_2019MetaLife.md b/source/_posts/20190108_2019MetaLife.md deleted file mode 100644 index 736a944a..00000000 --- a/source/_posts/20190108_2019MetaLife.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -title: 2019MetaLife -categories: 新年计划(2019) -url: 2019metalife -abbrlink: 14403 -date: 2019-01-08 00:28:42 -tags: -keywords: ---- - -**新年愿意清单** -- 尝试每天500字,锻炼文字组织能力 -- 做一款自己的小众产品,用户达到100人 -- 尝试录制短视频 -- 出版一本书籍 diff --git "a/source/_posts/20190112-\346\263\242\345\234\272Tron-\345\217\257\345\277\253\346\215\267\345\274\200\345\217\221\347\232\204\345\256\236\346\210\230\345\267\245\347\250\213\346\250\241\346\235\277.md" "b/source/_posts/20190112-\346\263\242\345\234\272Tron-\345\217\257\345\277\253\346\215\267\345\274\200\345\217\221\347\232\204\345\256\236\346\210\230\345\267\245\347\250\213\346\250\241\346\235\277.md" deleted file mode 100644 index a6590f4e..00000000 --- "a/source/_posts/20190112-\346\263\242\345\234\272Tron-\345\217\257\345\277\253\346\215\267\345\274\200\345\217\221\347\232\204\345\256\236\346\210\230\345\267\245\347\250\213\346\250\241\346\235\277.md" +++ /dev/null @@ -1,245 +0,0 @@ ---- -title: 波场Tron-可快捷开发的实战工程模板 -categories: 区块链技术 -url: tron_boilerplate -tags: - - tron boilerplate - - 波场开发指南 -keywords: - - tron_boilerplate - - 波场项目实战 - - tron.network - - 波场开发指南 -abbrlink: 20099 -date: 2019-01-12 06:42:54 -toc: true -description: - - 本教程通过以自己定制的工程模板为示例,讲解工程构建、快捷键部署私链及整体完整的开发注程,并配以操作动图帮助大家理解。hackdapp愿与你分享。 HackDApp愿与你分享! ---- - -```bash - _ _ _ _ _ _ -| |_ _ __ ___ _ __ | |__ ___ (_) | ___ _ __ _ __ | | __ _| |_ ___ -| __| '__/ _ \| '_ \ _____| '_ \ / _ \| | |/ _ \ '__| '_ \| |/ _` | __/ _ \ -| |_| | | (_) | | | |_____| |_) | (_) | | | __/ | | |_) | | (_| | || __/ - \__|_| \___/|_| |_| |_.__/ \___/|_|_|\___|_| | .__/|_|\__,_|\__\___| - |_| -``` - -[** Tron-Boilerplate**](https://github.com/ChainDesk/tron_boilerplate), 是基于Tron公链的一套可快速搭建本地私链环境、发布合约以及配置完整的标准工程模板。 - -该工程模板旨在于帮助大家快速工程化本地开发环境,减少环境搭建以及调试开发流程过程中所需花费的大量时间,让大家将更多精力投入到产品设计与核心业务逻辑实现上。 - -使用提供的工程模板,可从以下四个方面提升开发效率: - -- 一键启动或暂停私链环境 -- 一键编译智能合约 -- 一键发布智能合约 -- 一键单元测试(jtest) - -同时,本工程模板附带了一个完整的示例代码(**Todolist**),可供大家参考与学习。示例效果如下: - - - -![](https://ws2.sinaimg.cn/large/006tNc79ly1fz354rjq8wg30go09sti8.gif) - -最后,开发人员只需按照项目工程结构,编写自己的智能合约、前端页面及与SDK交互逻辑即可。 - ----- - -## 前置依赖 - -### 1. 安装docker - -** Install Docker for Mac** : [https://docs.docker.com/docker-for-mac/](https://docs.docker.com/docker-for-mac/) -** Install Docker for Windows**: [https://docs.docker.com/docker-for-windows/install/](https://docs.docker.com/docker-for-windows/install/) - -更多资料可参考: [https://docs.docker.com](https://docs.docker.com/) - -### 2. 安装node - -To install or update nvm, you can use the install script using cURL: -```bash -curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash -``` -or wget -```bash -wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash -``` - -The script clones the nvm repository to /.nvm and adds the source line to your profile (/.bash_profile, /.zshrc, /.profile, or /.bashrc)._ - -```bash -export NVM_DIR="${XDG_CONFIG_HOME/:-$HOME/.}nvm" -[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm -``` - -更多资料可参考: [https://github.com/creationix/nvm#installation](https://github.com/creationix/nvm#installation) - -### 3. 安装jdk8 - -JDK8: [https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) - -如果大家不使用tron提供的tron-studio开发合约的化,可以选择不安装此项。因为使用tronbox同样也可以编译以及发布合约。 - -### 4. 安装tronbox - -```bash -npm install -g tronbox -``` - -![](https://ws4.sinaimg.cn/large/006tNc79ly1fz36n5t5vqj30gk0b1aad.jpg) - -注:对于最新的 Java-Tron Odyssey 3.2 版本,最小兼容的 TronBox 版本是 TronBox 2.2.1。请确保您已安装此版本。 - -更多资料:[https://cn.developers.tron.network/docs/%E5%85%A5%E9%97%A8](https://cn.developers.tron.network/docs/%E5%85%A5%E9%97%A8) - -### 5. 开发工具 - -开发工具可根据自己喜好自由选择,个人比较推荐**VSCode**。 - -官网链接:[https://code.visualstudio.com/](https://code.visualstudio.com/) - -## 工程安装与使用 - -### 1. 克隆工程 - -```bash -git clone git@github.com:ChainDesk/tron_boilerplate.git -``` - -**工程结构介绍** -```bash -# 项目地址: https://github.com/ChainDesk/tron_boilerplate -# 注:待工程稳定后,可能会考虑做成插件,可使用yeoman快速构建,欢迎大家star. -. -├── README.md -├── bin -│   ├── libs -│   │   └── TronStudio.jar //TronStudio开发工具包 -│   ├── start_docker.sh //启动私链 -│   ├── start_tronstudio.sh //启动TronStudio -│   └── stop_docker.sh //停止私链 -├── build //合约编译生成目录 -│   └── contracts -│   ├── HelloWorld.json //示例合约ABI, HelloWorld -│   ├── Migrations.json -│   └── TodoList.json //示例合约ABI, TodoList -├── contracts //合约目录,大家合约都放在这儿 -│   ├── HelloWorld.sol -│   ├── Migrations.sol -│   └── TodoList.sol -├── migrations //发布合约目录 -│   ├── 1_initial_migration.js -│   └── 2_deploy_contracts.js //新添加的合约需要在此文件中定义,否则无法通过tronbox deploy命令发布 -├── package-lock.json -├── package.json //前端App工程及依赖包定义,以及多个服务启动命令。 -├── public -│   ├── favicon.ico -│   ├── index.html -│   └── manifest.json -├── src //前端React代码目录 -│   ├── TodoList.js -│   ├── contracts -│   │   └── TodoList.json //合约ABI文件 -│   ├── index.js -│   ├── serviceWorker.js -│   └── tronweb.js //新启动的工程,需要根据私链生成的私钥以及新发布的合约地址在此重新修改。 -├── test //jtest测试目录,方便大家编写测试用例 -│   └── web.test.js -├── tronbox-config.js -└── tronbox.js //发布合约所依赖的配置,此文件定义了本地、测试以及正式网络的http访问地址 - -12 directories, 27 files -``` - -### 2. 工程初始化 - -```bash -npm install -``` - -这一步主要用于更新前端框架react所依赖的包文件,依赖包安装成功后,会在工程目录下看到一个`node_modules`文件夹。 - -如果你的前端选型不是react的化,也可根据自己需求进行依赖包配置修改。 - -### 3. 正式开发流程 -#### 3.1 启动链环境 - -执行`cmd+shift+p`,调用vscode的命令列表,选择run task从中选择start_docker任务_ - -![](https://ws4.sinaimg.cn/large/006tNc79ly1fz37ttdzdsg30go09sn7r.gif) -同样,如果要停止当前docker环境,只需选择stop_docker脚本即可。_ - -所有的执行任务配置默认只存在两个地方: -- tron_boilerplate/.vscode/tasks.json_ -- package.json中的scripts -大家可根据自己需要进行添加或修改,而且也可以通过IDE本身的快捷键映射对应的任务。 - -#### 3.2 发布合约 - -运行task任务,然后从中选择`npm deploy`, 即可发布当前所有合约至私链环境。 - -![](https://ws2.sinaimg.cn/large/006tNc79ly1fz380y3oeog30go0907wh.gif) - -合约发布成功后,会显示如下: - -```bash -Using network 'development'. - -Running migration: 1_initial_migration.js - Replacing Migrations... - Migrations: - (base58) TBC7CqpjBxGUt9Z9hhM4QNRFF5osvG3j6r - (hex) 410d68b1bfd19d341bd0f772fad8697432d0d771be -Saving successful migration to network... -Saving artifacts... -Running migration: 2_deploy_contracts.js - Replacing TodoList... - TodoList: - (base58) TFyEw5qRRiZTJ5boLZJxZnv2hnhpBuvkjm - (hex) 4141d25df475fe0c053a9e2ed3a77faa10329185f0 -Saving successful migration to network... -Saving artifacts... -``` - -#### 3.3 修改配置参数 - -打开文件, tron_boilerplate/src/tronweb.js, 代码如下: _ -```bash -... -const fullNode = new HttpProvider('http://127.0.0.1:8090'); -const solidityNode = new HttpProvider('http://127.0.0.1:8091'); -const eventServer = 'http://127.0.0.1:8092'; - -const privateKey = "<私钥地址>"; -const contractAddr = "<合约地址>"; -...... -``` - -#### 3.4 启动react服务 - -执行`cmd+shift+p`,调用vscode的命令列表,选择run task从中选择`npm start`即可启动前端服务。 - -![](https://ws3.sinaimg.cn/large/006tNc79ly1fz3883zfdlg30go091txz.gif) - -打开浏览器,访问http://localhost:3000, 验证是否成功。 - ----- - -到此,整个工程的搭建及开发流程就介绍完毕,如中间出现任何问题欢迎加我个人微信咨询。 - -## 开发资料 -- 波场官网:https://tron.network/index?lng=zh -- 波场区块链浏览器(主网): https://tronscan.org/#/ -- 波场区块链浏览器 (测试网)https://test.tronscan.org/#/ -- Documentation: https://github.com/tronprotocol/Documentation -- TRON开发者文档: https://developers.tron.network/ -- 开发工具介绍: https://medium.com/tron-foundation/an-all-in-one-tool-suite-for-tron-developers-d048b2bc9b6c -- TRON Chrome插件集成示例:https://github.com/tronpay/TronPay-Extension -- Tron-BIP44 implementation: https://www.npmjs.com/package/@faast/tron-payments -- TRON开发项目模板(tron_boilerplate):[https://github.com/ChainDesk/tron\_boilerplate](https://github.com/ChainDesk/tron_boilerplate) - ----- ------ -> 在教程中如出现不易理解或存在错误的问题,欢迎加我微信指正! -> Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org diff --git "a/source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" "b/source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" deleted file mode 100644 index 9cb9a94e..00000000 --- "a/source/_posts/2019012102-\345\235\232\346\214\201\347\232\204\351\225\277\346\200\247.md" +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: 坚持的长性 -categories: 思维认知 -url: think_habit -tags: - - 习惯养成 - - 仪式感 - - 内心的满足 - - 2019要做的事 -keywords: - - 习惯养成 - - 仪式感 - - 内心的满足 - - 2019要做的事 -abbrlink: 22134 -date: 2019-01-21 09:31:24 -toc: true ---- - -![](https://ws1.sinaimg.cn/large/006tNc79gy1fzdyksu0ykj30qy0dw400.jpg) - -今天早上算是被媳妇嘲笑了一番,为啥呢? - -因为之前自己有一段时间,为了背英语单词,所以早起了一个月,而如今早一天晚一天,早起完全看心情。 - -媳妇给出的评价就是:用劲过猛,要么及早要么极迟,完全是一种过激行为。 - -同时她也给出建议:只要比上班的时间多出一小时其实就可以做很多事情。重要的是常态化。 - ----- - -2019开始了,自己确没开始。以前都早早给自己作出各种规划,对比现在,还不如之前的自己吗?不应该是每年比前一年好一些吗或者每天比昨天好一些吗? - -哦,也可能是最近超忙,导致各种规划的推迟。但内心同时又会想起另外一种声音:不,你不是,你只是懒。事情没把你逼到一种绝境上,你是不会立即行动的。 - -## 2019要做的事 - -1. 早起,不早起怎么做重要的事;而且希望能找到一些习惯思维方式; -2. 持续写作,写一本自己的技术书籍,打造自己的硬核; -3. 持续总结,不犯过去犯的错,少走弯路; -4. 思考习惯养成路径,以便培养自己新习惯的有效成功率 - -注:事情不在多,夯实好这几点。 - -## 目前的状态 - -- 时不时早起起来做一些事情,可能是工作上的,也可能是生活上的,但缺少对书的阅读;另外,感觉早上精力特别出奇的好,是否应该做一些最重要的事情,而读书的化放在晚上的时候。 -- 未达到持续写东西的地步,需要检讨;可能存在的原因: 对于第二天早上要写的东西,前一天没有大致规划;或者说并不需要规划,每天早上写的时候就按之前的套路写就可以了,不讲究一次写完写完美,而是持续写出自己的每个内容点,草稿结束后再修改,也是告诉自己好文章是持续修改出来的,不可能写完就扔那儿了,而是要持续完善。包括今天写的这篇,其实也是由之前早上写的卡片扩展而来的。 -- 总结之前过于重视形式化。总结对于我来讲,总感觉认可但又未给予足够的重视,因为总是断断续续的写一些自检清单。可能这个和习惯的养成也是一样,归根到底是没有成长的即视感,也就是没有反馈。比如:刮胡子,为什么要举这个例子呢?因为之前用电动剃须刀时,总是时不时刮一次;而用手动刮胡刀后,发现自己几乎每天都会坚持这件事。当时再想为什么这件事能坚持的如此之前呢?那其他事情怎么不能坚持下去呢?我是否能够从刮胡子这件事情中找到自己内心的那一份认识与感受呢。后来才发现,那是因为刮胡子这件事能让我内心出现一份好形象不邋遢的意识。洗漱的时候就是在潜意识里调动这份动力,而且在刮完胡子后更加让自己内心得以满足,这不正是一种仪式感吗? -- 正在有意识,感受自己每天坚持做一件事情的内心是如何的? - -所以,如果要让某个行为成为你的习惯,你就要从内心上提高对它的认可,以及最重要的一件事,你要寻找你的内心感受,是什么让你满足。如果这个不好理解的话,我给你的建议就是观察你已有的习惯中想想那是一种什么感觉,做个比较可能会更形象一些。 diff --git a/source/_posts/20190128-eossmart-c-basic.md b/source/_posts/20190128-eossmart-c-basic.md deleted file mode 100644 index 8e3343b4..00000000 --- a/source/_posts/20190128-eossmart-c-basic.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -title: C++基础语法(EOS完全开发指南) -categories: EOS完全开发指南 -url: eosdev_cplus_basic -tags: - - EOS完全开发指南 - - C++导读 - - EOS合约开发教程 -keywords: - - EOS完全开发指南 - - C++导读 - - EOS合约开发教程 -abbrlink: 7231 -date: 2019-01-28 18:16:50 -toc: true ---- -`Author: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org` - -```c -/* filename: myapp.cpp - date: 2019-01-28 3:06 PM - auth: zhangliang */ - -#include //定义头文件 -#include - -int main() -{ - using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string - - string msg = "hi, my first dapp"; //定义变量 - - cout << msg < - -## 1. `#include ` - -头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。 - -比如:通过引用``库,可以帮助我们快速使用里面的函数进行一些数学运算。 - -![函数列表](https://ws3.sinaimg.cn/large/006tNc79ly1fzmer35re6j30l30j6myt.jpg) - -所以,后续我们需要学会便是如何查阅C++文档库,不断积累与完善对于第三方标准库的方法学习与理解。 - -## 2. `int main()` - -`main`函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。 - -```c -#include -#include - -using namespace std; - -string sayHi(string username) -{ - return string("hi, ").append(username).append("!"); -} - -int main() -{ - cout << sayHi("www.hackdapp.com") << endl; -} -//tryit: http://tpcg.io/uHUkzy -``` - -函数定义,其实对于所有编程语言的定义方式大致相同, 都可以表现为以下形式 - -```c -<返回类型|void> 方法名(参数定义1, 参数定义2,参数定义...) -{ - //do some stuff - return <返回数据> -} -``` - -如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。 - -注: 在后续的第二部分,我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。 - -## 3. `string message = "hi, my first app"` - -变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。 - -而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。 -我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。 - -尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。 - -换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。 - -另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。 - -## 4. `cout << msg < - -另一个角度讲,正是由于这种限制,也是减小了我们的学习范围,这样我们就不需要完全掌握的整个C++的语言体系,便可以开发智能合约。比如:文件操作读取,时间函数,随机数,这些在EOS合约里是都不可用的。 不过,有一个问题就是你无法明确知道哪些功能被禁用了,只能去试。或者官网有说明,可能我没有看到而已。 - -在整个开发过程,你只需要学会使用一些基础语法,简单数据类型、数据结构以及常用的一些工具库。比如:如何处理字符串,如何存储或操作数据结构。 - -除此之外,再掌握一些程序设计技巧,就可以实战开发自己的DApp应用了,而本身程序设计其实是与哪种程序语言不存在直接关系的,只是让你的程序有更好的应对扩展。 - -通过本章节内容你可以学会: - -- 对基础数据类型以及它们的数据边界有清晰的认识; -- 学会如何使用不同数据结构处理业务场景中的问题; -- 学会如何定义自己的函数; -- 学会如何面对对象的思维设计自己的合约; -- 学会如何通过模板封装形成自己的工具库; -- 了解一些常用的标准库文件及常用的函数工具方法; -- 学会如何通过手册查找工具函数 - ----- - -本章节,将会从以下八个部分进行分类介绍: - -1.1 C++基础语法 -1.2 基础数据类型及变量、常量定义 -1.3 结构体及函数定义 -1.4 数据结构 -1.5 面向对象编程 -1.6 高级应用(模板定义) -1.7 标准库及库函数 -1.8 资源及经验分享 - ----- - -`注:` 在教程中如出现不易理解或存在错误的问题🐛,欢迎评论留言! \ No newline at end of file diff --git a/source/_posts/20190214-rebuildbrain-habit.md b/source/_posts/20190214-rebuildbrain-habit.md deleted file mode 100644 index 2c4beb69..00000000 --- a/source/_posts/20190214-rebuildbrain-habit.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: 重塑思维:自律 VS 习惯 -categories: 思维认知 -url: rebuildbrain_habit -tags: - - 重塑思维 - - 自律与习惯 - - 思维认知 -abbrlink: 53231 -date: 2019-02-14 15:46:39 -keywords: -description: - - 本周最大的收获就是:搞清楚自律与习惯间的转换逻辑。明白靠自律去约束自己只能不断内耗意志力,相反如果通过打造系统逻辑,形成习惯便可从根本上提高效率。因为本身习惯不消耗意志力而是一种肌肉反应能力。HackDApp愿与你分享! ---- - -**自律使我压抑,习惯助我成长。** 自律与习惯,其实目标都是一致的,只是所产生的行动动力源是不相同的。 - -相信每个人都在不停的思考一个问题,“我如何才能使明天的自己比今天的自己更加优秀一些呢?” - -为了让自己变得更好,我们去总结规律,改变自我认知,希望能从不断的思维升级过程中,锻造出属于自己的思维工具,培养及丰富问题症结的方案库。 - -为了让自己变得更好,我们需要靠意志去坚持去做一件让自己变得优秀的事情,但你发现一段时间之后,这件事不了了知,扔那儿放下了,因为这样的事在我的人生当中简直太熟悉不过了。 - -相反,有一些行为却长期固化下来了,比如我们的一些日常洗漱习惯,即使你中途有一段时间没去做,那你也不会放弃这件事。 - -当某一种行为已经成为你的习惯时,如果你有意识的去观察一下,会发现一些许规律。比如:刷牙,可能现在没有不早晚刷牙的童鞋吧。不妨想一想这个行为大家保持了多少年,到现在是否还需要各种精神动力去推着自己去做这个事吗? - -明显不需要,可以说这已经是写入自己骨头里的一种惯性行为,你要是不注意都不发现它原来其实就是一个号的学习榜样。因为它太习以为常了,平常的都忘掉它的存在。 - -那既然刷牙可以养成习惯,那我们其他行为为啥就不能养成一种习惯呢? - -首先,处于习惯性的行为执行过程并不会让你特别有心理负担; -其次,习惯中的行为并不会消耗自己稀缺的精力; -最后,行为关联及导向性。也就是习惯行为之间的联动开关。比如:洗漱的时候总能与刷牙这件事产生一定的链接,而这个链接往往就是我们通过意识去不断增强脑回路而形成的。 - -之所以总结这些,就是因为我身上的一件事,当时看李笑来的专栏里曾经提到一种感受,就是“不做这件事就难受”。 当时是在是无法理解这种状态,除了吃饭这件事,找不出天天不做就难受的事来,当你无法从自身找到可以参考的例子时,你总是无法理解其概念。 - -直到我发现身上这件事,`刮胡子`。对,你没看错,就是刮胡子。 - -为什么讲呢?因为之前总是用电动剃须刀,总是容易忘记用,时做时不做的,而且刮的也不是太干净。直到有一天看到京东做活动卖手动剃须刀,想着买来试一试,但当时也犹豫,每天早上用这个会不会特花时间啊。 - -但事实证明,相比电动剃须刀,手动的虽然要麻烦一些,时间也要多花费一些。但这件事我却坚持了一年,直至今日从心理感受来讲,自己并没有感觉每天要逼着自己去做这件事,而是很自觉的每天洗漱后自动进入刮胡子状态。 - -为什么会这样呢?因为每一次刮完胡子,对着镜子一照,感觉干净清爽,漂亮,帅气。让我从内心看到一个舒服的自己,这算不算是一种仪式感呢。 - -后来,我总结了一下习惯养成的一个关键因素:持续的心理反馈。反馈可以让我们感受到变化与进步,或是一种心理满足;而持续性一来可以增强行为的动力,二过可以慢慢促进脑回路的链接建立。 - -那么,如何建立自己的习惯养成路径呢?那就是 - -1. 先制定一个你绝对认可其价值的目标; -2. 在意识中建立诱导因子,也就是你需要在已形成的习惯之中,建立一个与新行动的触感连接; -3. 持续反馈,每天都要总结,让自己内心见证成长,而后通过持续达到巩固行动的动力。 - -## 小结 - -好的习惯、应用技巧及思维方式是可以产生复利效应价值的,关键在于它不是形式上的应用,不是为技巧而技巧,一定是在我们的生活或工作实际场景中解决实际问题,并以此不断反馈价值收获,而持续的价值收益又会加强我们执行的动力,最终形成一个正向向上的良性循环♻️。 - -执行力其实是落实行动的第一要素,所以我们需要学会如何去补充这项能源。而最好的方式就是让自己认可这件事的价值。并且能够在做事的过程中,有深刻的反馈与心理感受,学会记录自己的心理变化。 - -最后,通过不断的执行与反馈,增强我们的脑回路链接。久而久之,就会成为我们的习惯。 diff --git "a/source/_posts/20190307_\345\211\226\346\236\220EOS\345\220\210\347\272\246\347\274\226\350\257\221ABI\346\226\207\344\273\266.md" "b/source/_posts/20190307_\345\211\226\346\236\220EOS\345\220\210\347\272\246\347\274\226\350\257\221ABI\346\226\207\344\273\266.md" deleted file mode 100644 index 9c9e0aa1..00000000 --- "a/source/_posts/20190307_\345\211\226\346\236\220EOS\345\220\210\347\272\246\347\274\226\350\257\221ABI\346\226\207\344\273\266.md" +++ /dev/null @@ -1,266 +0,0 @@ ---- -title: 剖析EOS合约编译ABI文件 -categories: EOS完全开发指南 -url: eosdev_contract_abi -tags: - - EOS完全开发指南 - - EOS完全开发手册 - - EOS合约开发教程 - - eos smart abi -keywords: - - EOS完全开发指南 - - EOS完全开发手册 - - EOS合约开发教程 - - eos smart abi -description: - - 每个EOS合约开发者肯定都知道ABI文件,但却不一定都知道ABI内部属性是什么,具体作用。本文hackdapp将带你一探ABI究竟。HackDApp愿与你分享! -abbrlink: 64309 -date: 2019-03-07 19:33:14 ---- - -相信不少开发者朋友在进行EOS合约开发时,都看到发布智能合约时的ABI文件。那ABI文件到底是什么东西?在EOS公链环境中到底发挥怎么样的作用呢以及如何解读ABI文件内容呢? - -那么本章节将带你了解ABI文件与智能合约间的关系以及了解并学会ABI文件的编写。 - -**ABI**, 简称(Application Binary Interface), 是一个基于JSON语言的接口描述文档,用于描述EOS合约以及如何对合约方法进行调用。如果大家曾经接触过websocket、avro、hession、thrift等这类技术的化,那么是大体逻辑是相向的。比如websocket所提供的wsdl其实也是对websocket本身对外所提供服务的接口描述。 - -在EOS合约,ABI文件是由开发组件eosio.cdt工具包中的eosio-cpp命令执行所生成的文件。但在实际开发时,时常会碰到一些情况无法生成ABI文件。因为在合约开发,我们往往会根据业务自定义一些数据结构,或者使用一些第三方方法,而eosio.cdt本身对所有特隆并不是支持的很完善,所以时常导致编译失败,这时就需要我们理解ABI是如何定义智能合约的,以便于我们定制化修改自己的合约描述。 - -ABI文件结构是由什么组成的呢?让我们先看一个示例 - -```bash -{ - "version": "eosio::abi/1.0", - "types": [], - "structs": [], - "actions": [], - "tables": [], - "ricardian_clauses": [], - "abi_extensions": [], - "___comment" : "" -} -``` - -上面json示例展示了一个标准智能合约所应具备的完整属性定义。 - -**数据类型(type)** -在项目开发过程,有时为了便于代码的理解,我们会将一些通用数据类型或数据结构进行别名定义,用一个在业务场景中更加贴合业务的名称代替。在`types`数组中便是对这种情况的定义描述。 - -比如: -```bash -{ - "new_type_name": "age", - "type": "int" -} - -或者 - -{ - "new_type_name": "name", - "type": "string" //此处user为自定义数据结构 -} -``` -对于合约内嵌类型,是不会在此展示的。诸如: uint64\_t、name、asset、symbol等。下图展示了EOS合约所支持的所有内置数据类型 -![](http://image.chaindesk.cn/2019-03-07-095044.jpg) - ----- - -**结构体(struct)** -在业务处理逻辑中,为了方便数据的传输与调用,往往我们会对针对业务数据进行建模并以结构体的形式展现。同样,它也需要在ABI文件中进行描述。 - -比如: eosio.token合约中的account结构体定义 -- ABI文件定义 - ```bash - { - "name": "account", - "base": "", - "fields": [ - { - "name": "balance", - "type": "asset" - } - ] - } - ``` -- eosio.token.hpp实现 - ```bash - struct account { - asset balance; - - uint64_t primary_key()const { - return balance.symbol.code().raw(); - } - }; - ``` - -另外,需要注意的就是除了以上这种结构体定义,其实还存在一种隐性结构体,即:合约方法参数 -示例: -- eosio.token.hpp中transfer方法定义 - ```bash - void transfer( name from, - name to, - asset quantity, - string memo ); - ``` -- eosin.token合约中transfer方法在ABI文件中定义 - ```bash - { - "name": "transfer", - "base": "", - "fields": [ - { - "name": "from", - "type": "name" - }, - { - "name": "to", - "type": "name" - }, - { - "name": "quantity", - "type": "asset" - }, - { - "name": "memo", - "type": "string" - } - ] - } - ``` - -可以看出,隐性结构体与前面所定义显性结构体定义是并没有什么不同,只是在智能合约业务逻辑中,我们仅用到显性结构体来存储我们的业务数据进行逻辑判断。 - ----- - -**方法(Action)** -` Action`数组主要用于描述外部可调用的方法列表以及具体的参数列表。在智能合约中,如果需要对外公开合约方法,往往会在合约头文件中进行如下定义: -```bash -[[eosio::action]] -void transfer(name from,name to, asset quantity, string memo); -``` -而ABI的表现形式为: -```bash -{ - "name": "transfer", - "type": "transfer", - "ricardian_contract": "" -} -``` -从上述描述可以看出,在方法的类型定义关联了前面的隐性结构体类型。虽然在此处,方法名与隐性结构体类型命名一致,但实际情况并不一定非要相同。 - ----- - -**表定义(Table)** -关于表的ABI定义,相比其他几种定义要稍复杂一些。具体JSON定义如下 -```bash -{ - "name": "", - "type": "", - "index_type": "", - "key_names" : [], - "key_types" : [] -} -``` -JSON中字段说明如下: -- name - 合约初始化表时所要使用的名称 -- type - 表对应的数据结构体。也就是前面所说的显性结构体类型 -- index \_type - 此类型为表主键类型 -- key \_names - 索引字段列表 -- key\_types - 索引字段数据类型列表。数据长度与索引字段列表长度一致。需要说明的是索引字段类型,只支持uint64\_t,uint128 \_t,uint256 \_t,double,long double五种类型 -示例:eosio.token合约中的accounts表 -- ABI表定义 - ```bash - { - "name": "accounts", - "type": "account", - "index_type": "i64", - "key_names": ["primary_key"], - "key_types": ["uint64"] - } - ``` -- 表合约代码 - ```bash - struct [[eosio::table]] account { - asset balance; - - uint64_t primary_key()const { return balance.symbol.code().raw(); } - }; - ``` -从表合约代码可以看来,只需要在数据结构体代码中添加eosio-table标签就可以完成对表的定义操作。 - -之所以提供多索引的实现,主要还是为了应对业务场景中不同维度的数据查询,而且支持按升序或降序的遍历方式处理业务。 - ----- - -**ricardian条款(ricardian\_clauses)** -该数组主要用于定义一种基于文本的合约宪法。通过其与智能合约的整合,来解决一些无法通过程序来判定的情况。 - -示例如下: -```bash -"ricardian_clauses": [{ - "id": "Warranty", - "body": "WARRANTY. The invoker of the contract action shall uphold its Obligations under this Contract in a timely and workmanlike manner, using knowledge and recommendations for performing the services which meet generally acceptable standards set forth by EOS.IO Blockchain Block Producers.\n\n" - },{ - "id": "Default", - "body": "DEFAULT. The occurrence of any of the following shall constitute a material default under this Contract: \n\n" - },{ - "id": "Remedies", - "body": "REMEDIES. In addition to any and all other rights a party may have available according to law, if a party defaults by failing to substantially perform any provision, term or condition of this Contract, the other party may terminate the Contract by providing written notice to the defaulting party. This notice shall describe with sufficient detail the nature of the default. The party receiving such notice shall promptly be removed from being a Block Producer and this Contract shall be automatically terminated. \n \n" - } - ] -``` - -我们可以针对智能合约或者具体的合约方法,附加上对应的文本合约描述。比如针对方法的文本合约定义: -- ABI定义 - ```bash - "actions": [{ - "name": "hi", - "type": "hi", - "ricardian_contract": "# CONTRACT FOR hello::hi## ACTION NAME: hi\n### Parameters### Parameters\nInput parameters:Input parameters:\n\n* `user` (string to include in the output)* `user` (string to include in the output)\n\nImplied parameters: Implied parameters: \n\n* `account_name` (name of the party invoking and signing the contract)* `account_name` (name of the party invoking and signing the contract)\n\n### Intent### Intent\nINTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect.\n\n### Term### Term\nTERM. This Contract expires at the conclusion of code execution.TERM. This Contract expires at the conclusion of code execution.\n" - }] - ``` -- 代码及文件定义(hello.hi_rc.md) - ```bash - # CONTRACT FOR hello::hi - - ## ACTION NAME: hi - - ### Parameters - Input parameters: - - * `user` (string to include in the output) - - Implied parameters: - - * `account_name` (name of the party invoking and signing the contract) - - ### Intent - INTENT. The intention of the author and the invoker of this contract is to print output. It shall have no other effect. - - ### Term - TERM. This Contract expires at the conclusion of code execution. - ``` ----- - -**ABI Extensions** -该功能将允许用户进行自定义区块扩展, 包括对数据的签名、编码等。不过现在该属性暂未被应用支持。 - ----- - -到此,相信大家对于整个ABI文件的结构应该有了大体的认识与理解。这样大家可以在研究其他智能合约时,可以首先阅读对方的ABI文件,就可以熟悉对方的整体接口框架。 - ----- - -> 在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正! -> Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org - ----- - -**changelog** -2019-03-07 [zhangliang](mailto:zhangliang@cldy.org) - - 初次发稿 diff --git a/source/_posts/2019031201_eossmart_deploycontract_eosjs.md b/source/_posts/2019031201_eossmart_deploycontract_eosjs.md deleted file mode 100644 index fd3d5a2a..00000000 --- a/source/_posts/2019031201_eossmart_deploycontract_eosjs.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -title: 使用EOS.js发布EOS智能合约 -categories: EOS完全开发指南 -url: eosdev_deploycontract_eosjs -tags: - - EOS完全开发指南 - - deploy contract - - EOS合约开发教程 -keywords: - - EOS完全开发指南 - - deploy contract - - EOS合约开发教程 -description: - - 之前我们曾经介绍过如何使用EOS的系统命令(cleos set contract)发布智能合约,那么今天将分享另外一种方式:使用eosjs-sdk发布合约。在此基础上,可以通过配置package.json脚本以及IDE快捷链,可以快速提升DApp开发效率。HackDApp愿与你分享! -abbrlink: 10133 -date: 2019-03-12 18:59:46 ---- - -在之前的EOS合约开发文章,你可能学会了如何通过EOS系统命令**cleos set contract**的方式进行智能合约的发布与升级。 - -但在开发过程中,可能有的同学持续在命令容器与开发IDE间频繁切换,对开发效率有一定程序的影响,那是否有一种更好的方式帮助我们在一个窗口里快速发布合约呢? - -那么本文将带你了解**如何通过EOS.js进行智能合约的发布**。 - -![](http://cdn.hackdapp.com/2019-03-12-083806.jpg) -如上图所示,在进行合约发布时,需要用到eos系统合约中的两个方法:setcode、setabi。而这两个方法分别会用到智能合约编译后的两个文件: \*.wasm、\*.abi。 - -**注意** : 本文示例中使用的eosjs的版本为`16.0.9 `。 - -**首先**,需要初始化EOS-SDK实例。 事先准备好初始化SDK所必需的参数: -- chainid - 所要发布的目标EOS链chainid. 例如:正式chainid: aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906; jungle测试网chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473等等 -- httpEndpoint - EOS链环境http接口地址。 例如: http://localhost:8888 -- keyProvider - 合约帐户私钥,主要用于交易签名。 - -```bash -//config.js -const Eos = require('eosjs') - -const eos = Eos({ - chainId: "cf057bbfb72640471fd910bcb67639c22df9f92470936cddc1ade0e2f2e7dc4f", - httpEndpoint: "http://localhost:8888", - keyProvider: "5K7mtrinTFrVTduSxizUc5hjXJEtTjVTsqSHeBHes1Viep86FP5", - broadcast: true, - sign: true -}) - -module.exports = { - eos, -} - -//https://gist.github.com/hackdapp/2522411b98b1acdadc0d842f712ca6e0 - -``` - -**下一步**,需要代码实现对合约文件夹中的.wasm及.abi文件的读取; - -```bash -function getDeployableFilesFromDir(dir) { - const dirCont = fs.readdirSync(dir) - const wasmFileName = dirCont.find(filePath => filePath.match(/.*\.(wasm)$/gi)) - const abiFileName = dirCont.find(filePath => filePath.match(/.*\.(abi)$/gi)) - if (!wasmFileName) throw new Error(`Cannot find a ".wasm file" in ${dir}`) - if (!abiFileName) throw new Error(`Cannot find an ".abi file" in ${dir}`) - return { - wasmPath: path.join(dir, wasmFileName), - abiPath: path.join(dir, abiFileName), - } -} - -//https://gist.github.com/69b29103e5cc114f4478390076d8ad39 -``` - -**然后**,通过调用eos实例,分别执行系统合约的setcode/setabi方法,从而达到智能合约的发布; - -```bash -function deployContract({ account, contractDir }) { - const { wasmPath, abiPath } = getDeployableFilesFromDir(contractDir) - - const wasm = fs.readFileSync(wasmPath) - const abi = fs.readFileSync(abiPath) - - const codePromise = eos.setcode(account, 0, 0, wasm) - const abiPromise = eos.setabi(account, JSON.parse(abi)) - return Promise.all([codePromise, abiPromise]) -} - -//https://gist.github.com/69b29103e5cc114f4478390076d8ad39 -``` - -**最后**,调用deployContract方法,测试合约发布功能。 - -```bash -deployContract({ account: "eosio.token", contractDir: "./contract" }).then((result) => { - console.log(`Deployment successful`, JSON.stringify(result, null , 4)) -}) -.catch(err => { - console.error(`Deployment failed`, err) -}) - -//https://gist.github.com/69b29103e5cc114f4478390076d8ad39 -``` - ----- - -**小结** - -通过本文我们学习了如何通过eos实例的setcode/setabi方法将合约编译文件快速发布到指定链环境。 - -另外,如果为了提高发布合约效率,我们还可以在package.json中定义发布合约的运行脚本,并配合IDE工具中的快捷键,便可达到开发效率的进一步提升。 - ----- - -> 在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正! -> Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org - - - -注: 有想了解**愿码全思维IT工程师加速器**的朋友,可以扫码加群咨询。 - ----- - -### **changelog** -2019-03-12 [zhangliang](mailto:zhangliang@cldy.org) - - 初次发稿 diff --git a/source/_posts/2019031301-eossmart-datastorage-historyaction.md b/source/_posts/2019031301-eossmart-datastorage-historyaction.md deleted file mode 100644 index ca24b098..00000000 --- a/source/_posts/2019031301-eossmart-datastorage-historyaction.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: 巧用HistoryApiAction实现对链数据的存储与查询 -categories: EOS完全开发指南 -url: eosdev_datastorage_historyaction -tags: - - EOS完全开发指南 - - 合约数据存储 - - history action - - inline action -keywords: - - EOS完全开发指南 - - 合约数据存储 - - history action - - inline action -description: - - 在开发EOS DApp智能合约时,我们都知道可以使用`multi\\_index\_`来对合约数据的存储与查询,但合约的存储是需要消耗一定的资源的,而且随着用户的增长往往会导业务数据会越来越大,从而导致合约需要更多的资源来支撑其数据增长。那么是否有一种更好的方式来降低某些场景的资源消耗呢?那么,今天将为你分享一种数据存储方案: 借用EOS链提供的`history_api_action\_`插件、`内部合约Action调用`来完成对业务数据的存储与查询。HackDApp愿与你分享! -abbrlink: 63840 -date: 2019-03-13 16:36:13 ---- - -在开发EOS DApp智能合约时,我们都知道可以使用`multi_index `来对合约数据的存储与查询,但合约的存储是需要消耗一定的资源的,而且随着用户的增长往往会导业务数据会越来越大,从而导致合约需要更多的资源来支撑其数据。 - -有时我们可以通过业务设计,让业务数据得到即时清理及资源释放。但大多数情况下,业务数据是不允许清理的,那么针对这种情况是否有其他办法来降低对合约存储资源的消耗呢? - -那么,今天分享的方案就是:借用EOS链提供的`history_api_action `插件服务、内部合约Action调用来完成对业务数据的存储与查询。 - -举个🌰️: -在去中心化交易所中,往往搓合成功会产生大量的成交订单,那保存在合约数据库中肯定是不合适的,所以可以在搓合方法中通过调用内部日志方法的形式,通过交易日志来将订单数据写入区块中;然后通过EOS节点提供的[查询历史action接口](https://developers.eos.io/eosio-nodeos/v1.4.0/reference#get_actions-1),查询合约日志数据并增量同步到中心化数据库。 - -下面,我们将通过具体的代码示例来帮助大家理解整个过程: - ----- - -**首先**,我们新创建一个合约(dexchange.hpp/dexchange.cpp); -```bash -//dexchange.hpp -#include -#include - -using namespace eosio; - -CONTRACT dexchange : public contract { - public: - using contract::contract; - dexchange(eosio::name receiver, eosio::name code, datastream ds):contract(receiver, code, ds) {} - - [[eosio::action]] - void executetrade(uint64_t pair_id, uint64_t sell_order_id, uint64_t buy_order_id); - - [[eosio::action]] - void log(uint64_t deal_price, uint64_t quantity, uint64_t sell_order_id, uint64_t buy_order_id); - -}; - -EOSIO_DISPATCH(dexchange, (executetrade)(log)) - -//https://gist.github.com/2b68242019242bdd12f174208e39e7d2 - -``` -**然后**,定义并实现两个方法:executetrade、log。 `executetrade `合约方法负责搓合业务,当搓合业务处理完之后调用`log`方法,通过交易信息将参数调用数据写入区块中; - -```bash -//filename: dexchange.cpp - -#include "dexchange.hpp" - -void dexchange::executetrade(uint64_t pair_id, uint64_t sell_order_id, uint64_t buy_order_id){ - uint64_t deal_price = 1200; - uint64_t quantity = 10000; - - action( - permission_level{ _self, "active"_n }, - _self, "log"_n, - std::make_tuple(deal_price, pair_id, sell_order_id, buy_order_id) - ).send(); -} - -void dexchange::log(uint64_t deal_price, uint64_t quantity, uint64_t sell_order_id, uint64_t buy_order_id){ - require_auth( _self ); -} - -//https://gist.github.com/ea6ec431a57faee3a2823cfeee406efd - -``` -从以上示例可以看出,合约log日志方法其实并不需要做任何业务逻辑处理。只需要间接被调用,便可将我们需要的业务数据通过交易的形式记录在区块中,而不会浪费我们的合约存储空间,也不需要担心资源释放的问题。 - -**下一步**、发布智能合约,并调用一次`executetrade`合约方法 - -```bash -//发布合约至hackdappexch合约帐户 -> cleos set contract hackdappexch contracts/ -p hackdappexch@active - -//执行合约方法 -> cleos push action hackdappexch executetrade '[1,2,3]' -p hackdappexch@active - -``` - -**最后**,通过EOS链节点提供的[RPC服务](https://developers.eos.io/eosio-nodeos/v1.4.0/reference#get_actions-1),进行历史action数据查询,通过数据过滤找到我们的日志方法及参数数据。 - -在确保之前的操作都成功之后,我们使用curl命令查询其对应服务: - -```bash -curl --request POST \ - --url https://localhost:8888/v1/history/get_actions \ - --header 'content-type: application/x-www-form-urlencoded; charset=UTF-8' \ - --data '{"pos":-1,"offset":-10,"account_name":"hackdappexch"}' -``` - -通过此接口查询出来的数据不仅仅是`log`合约方法数据,可能还会存在该合约的其他方法事件,需要根据情况再过滤一次数据。 - -![](http://cdn.hackdapp.com/2019-03-13-080641.jpg) - -**补充说明** - -如果你在本地曾经搭建过EOS私链的化,那么或许看到过,EOS启动时是可以配置不同插件。而其中有一个插件`history_api_plugin `,就是用于监听并存储合约方法的调用信息;另外启动链节点时,是可以按规划自由指定所要监听的合约帐户及方法,如: `--filter-on hackdappexch::log `, 该参数配置表示只监听hackdappexch合约中的log方法。 - -```bash -nodeos -e -p eosio -d /mnt/dev/data \ - --config-dir /mnt/dev/config \ - --http-validate-host=false \ - --plugin eosio::producer_plugin \ - --plugin eosio::chain_api_plugin \ - --plugin eosio::http_plugin \ - --plugin eosio::history_api_plugin \ - --http-server-address=0.0.0.0:8888 \ - --access-control-allow-origin=* \ - --contracts-console \ - --filter-on hackdappexch:log: \ - --max-transaction-time=1000 \ - --verbose-http-errors & -``` - -如以上EOS节点启动命令,就展示了启动一个EOS节点的具体参数配置。其中,`--filter-on `参数便是指定只监听记录`hackdappexch `合约的`log `方法调用数据。 - -所以,当我们要通过链节点RPC服务查询合约方法历史调用数据时,需要先确认提供RPC服务的节点是否开启了`history_api_plugin`插件,以及自己所要查询的合约是否在其过滤规则之中。 - ----- -**小结** - -通过本篇文章,我们学会了利用**内部合约方法调用** ➕️ **链节点历史Action查询**的方式实现业务数据的另一种数据存储与查询方案。 - ----- - -> 在教程中如出现错误🐛或不易理解的知识点,欢迎加我微信指正! -> Name: zhangliang | WeChat: rushking2009 | Mail: zhangliang@cldy.org - - - ----- - -### **changelog** -2019-03-13 [zhangliang](mailto:zhangliang@cldy.org) - - 初次发稿 diff --git "a/source/_posts/20190404_\351\233\266\345\237\272\347\241\200\344\275\223\351\252\214EOS\345\205\245\351\227\250\345\220\210\347\272\246\345\274\200\345\217\221.md" "b/source/_posts/20190404_\351\233\266\345\237\272\347\241\200\344\275\223\351\252\214EOS\345\205\245\351\227\250\345\220\210\347\272\246\345\274\200\345\217\221.md" deleted file mode 100644 index 74b16767..00000000 --- "a/source/_posts/20190404_\351\233\266\345\237\272\347\241\200\344\275\223\351\252\214EOS\345\205\245\351\227\250\345\220\210\347\272\246\345\274\200\345\217\221.md" +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: 零基础体验EOS入门合约开发 -categories: EOS完全开发指南 -url: try_eoscontract_dev -tags: - - eoscontract - - eos dev -keywords: - - eoscontract -description: - - 本教程主要面向初阶开发人员,目的在于带领大家以最简单的示例合约,通过简单但不失完整的流程,体验整个合约的编译、发布与调用过程,从而让大家从直观角度有个清晰的概念认识。 -abbrlink: 52078 -date: 2019-04-04 07:00:00 ---- - -本教程主要面向初阶开发人员,目的在于带领大家以最简单的示例合约,通过简单但不失完整的流程,体验整个合约的编译、发布与调用过程,从而让大家从直观角度有个清晰的概念认识。 - ----- -**版本说明** -测试网公链版本: v1.7.0-dirty -EOSjS-SDK版本:16.0.9 -开发组件包(CDT): 1.5.0 - ----- - -## 一、帐户管理 - -### 1. Register EOS Account - -#### 生成公私钥 -在进行帐户注册时,需要事先提供一对公私钥地址,以便在注册帐号时进行绑定使用。可通过[EOS Key Generation](https://nadejde.github.io/eos-token-sale/)网站进行公私钥地址生成。 -![](http://cdn.hackdapp.com/2019-03-26-061513.png) -![](http://cdn.hackdapp.com/2019-03-26-061448.png) -#### 注册帐户 -通过[Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)](http://monitor.jungletestnet.io/#home)网站进行EOS帐户的创建 -![](http://cdn.hackdapp.com/2019-03-26-061701.jpg) -点击图中标红**create account**, 在弹出界面中,填写事先生成的公钥地址 -![](http://cdn.hackdapp.com/2019-03-26-062433.jpg) -![](http://cdn.hackdapp.com/2019-03-26-063220.jpg) -见上图中,需要填写三个信息,其中account name主要用于填写我们易于记忆的帐户名称,但其帐户名称长度只允许12位长度,且其组成字符也只能从a-z, 1-5以及一个点符号组成。 -至于owner public key和 active public key分别对应该帐户owner权限和active权限。如果从安全角度讲,两个权限所对应的公钥地址应该设置成不一样的,这样当active private key丢失的时候,可以使用ower权限对active权限对应的公钥地址进行更换。因为ower和active权限是有层次关系的,只允许低级权限对下次权限进行操作。在不丢失ower私钥的情况下,也可以实现对ower权限地址的更换操作。 - -点击**create**, 创建成功后,会显示如下信息 -![](http://cdn.hackdapp.com/2019-03-26-063306.jpg) - -### 2. Claim EOS -![](http://cdn.hackdapp.com/2019-03-26-063552.jpg) -在[Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)](http://monitor.jungletestnet.io/#home)页面,点击菜单栏中的**Faucet**按钮,会弹出如下界面 -![](http://cdn.hackdapp.com/2019-03-26-063708.jpg) - -### 3. Balance Query -![](2019-03-26%20at%2014.37.jpg) -在[Jungle2.0 - EOS Test Network Monitor (CryptoLions.io)](http://monitor.jungletestnet.io/#home)页面,点击菜单栏中的**account info**按钮,弹出如下界面: -![](http://cdn.hackdapp.com/2019-03-26-064031.jpg) -填写帐号名称后,点击**get**按钮, 便可以查到该用户的EOS余额及公钥地址信息。 - -### 4. Install Chrome Plugin: Scatter -#### 安装scatter -在chrome浏览器中安装[Chrome 网上应用店 - scatter](https://chrome.google.com/webstore/detail/scatter/ammjpmhgckkpcamddpolhchgomcojkle?hl=zh-CN)插件。 -![](http://cdn.hackdapp.com/2019-04-03-024637.jpg) - -**注: ** 如果Chrome插件商店无法打开,则可以使用[Start | Chrome Extension Downloader](https://chrome-extension-downloader.com/)进行下载。scatter插件地址: [https://chrome.google.com/webstore/detail/scatter/ammjpmhgckkpcamddpolhchgomcojkle?hl=zh-CN](https://chrome.google.com/webstore/detail/scatter/ammjpmhgckkpcamddpolhchgomcojkle?hl=zh-CN) -![](http://cdn.hackdapp.com/2019-04-03-025150.jpg) - -插件安装完成后,可以chrome浏览器中看到如下高亮图标。 -![](http://cdn.hackdapp.com/2019-04-03-024247.jpg) - -#### 使用scatter -- 初始化scatter帐户 - 填写密码,然后点击创建按钮 - ![](http://cdn.hackdapp.com/2019-04-03-025355.jpg) - 点击创建操作后,会显示如下界面,提示保存12个助记词 - ![](http://cdn.hackdapp.com/2019-04-03-025441.jpg) - 大家需要保存好这12个助词词,以便于在忘记密码时用助记词进行恢复。注:丢失此助记词则意味着你将永远丢失该帐户。 - -- 添加测试网络 - 首先、打开主界面后,点击右上解**系统设置** - ![](http://cdn.hackdapp.com/2019-04-03-025951.jpg) - 然后,选择网络,新建网络 - ![](http://cdn.hackdapp.com/2019-04-03-030455.jpg) - 填入测试网络的参数信息,比如: [http://jungle2.cryptolions.io:80](http://jungle2.cryptolions.io:80)、chainid: e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473 - chaind的获取方式,可以直接通过[http://jungle2.cryptolions.io/v1/chain/get\_info](http://jungle2.cryptolions.io/v1/chain/get_info)进行查询 - ![](http://cdn.hackdapp.com/2019-04-03-031702.jpg) -- 导入公私钥 - 回到主界面,选择**Key Pairs**, 然后导入之前创建的私钥 - ![](http://cdn.hackdapp.com/2019-04-03-031150.jpg) -- 绑定EOS帐户 - ![](http://cdn.hackdapp.com/2019-04-03-031446.jpg)![](http://cdn.hackdapp.com/2019-04-03-031901.jpg) ![](http://cdn.hackdapp.com/2019-04-03-032105.jpg) - -### 5. Buy(RAM、CPU、NET ) - -访问[内存交易 - 钱包 - EOSX - Fastest EOS Block Explorer](https://jungle.eosx.io/tools/ram/buy?symbol=10)网站,绑定scatter帐号 - -![](2019-03-26%20at%2016.44.jpg)![](2019-03-26%20at%2016.23.jpg) - -**购买RAM** -![](http://cdn.hackdapp.com/2019-03-26-085239.jpg) -**购买CPU与NET资源** -![](http://cdn.hackdapp.com/2019-03-26-085429.jpg) - - -## 二、合约开发 - -### 1. 编写示例合约 -在本地创建一个工程目录 -```bash -~> mkdir -p mycontract/{utils, contracts} -~> tree -. -├── contracts -└── utils -``` - -在工程目录contracts文件下,创建hello.cpp, -```bash -~> touch contracts/hello.cpp -``` - -打开hello.cpp, 填写以下内容 -```bash -#include - -using namespace eosio; - -class [[eosio::contract]] hello : public contract { - public: - using contract::contract; - - [[eosio::action]] - void hi( name user ) { - print( "Hello, ", user); - } -}; - -EOSIO_DISPATCH(hello, (hi)) - -``` -### 2. 编译合约 - -该步骤需要用到EOS合约开发所必需的cdt开发工具包, 来完成对示例合约的编译工作。 - -1)在本地安装eosio-cpp工具命令 -```bash -brew tap eosio/eosio.cdt //增加仓库 -brew install eosio.cdt //安装工具包 -``` - -注: 可使用**eosin-cpp --help**命令来查看所有参数说明 - -2)进行合约编译,生成abi合约描述文件及wasm合约文件 -```bash -eosio-cpp -abigen 'contracts/hello.cpp' -o 'contracts/hello.wasm' --contract 'hackdappcom1' -``` - -编译完成后,会在工程目录生成hello.abi、hello.wasm两个编译文件。hello.abi就好比webservice中的wsdl描述语言一样,主要用于对合约接口及数据结构进行结构性描述, wasm文件为合约编译后的二进制文件。 - -**ABI文件详细说明**: [剖析EOS合约编译ABI文件 | HackDApp](https://www.hackdapp.com/archives/eosdev_contract_abi.html) - -### 3. 发布合约 -#### 初始化项目工程,并安装eosjs-sdk -使用`npm init`命令对项目进行初始化 -```bash -~> npm init -package name: (mycontract) -version: (1.0.0) -description: -entry point: (index.js) -test command: -git repository: -keywords: -author: -license: (ISC) -About to write to /Users/nolan/Desktop/mycontract/package.json: - -{ - "name": "mycontract", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC" -} -``` -然后,使用`npm install eosjs@16.0.9 `命令进行eos sdk组件安装 -```bash -~> npm install eosjs@16.0.9 -``` - -安装完成后, 整个项目工程目录结构显示如下: -```bash -~> tree -. -├── contracts //合约文件 -├── node_modules //依赖组件 -├── package-lock.json -├── package.json //工程配置定义 -└── utils //工具库 - -3 directories, 2 files - -``` -#### 编辑合约发布文件: deploy.js - -首先,在工程根目录下,创建deploy.js; -然后,打开该文件,并填下以下内容; -```bash -const eos = require('./utils/eossdk')({ - chainId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473", - httpEndpoint: "http://jungle2.cryptolions.io:80", - //更改处一: EOS合约Active权限权限 - keyProvider: "5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu",// 更改处二: 改为要发布的合约帐户名称 - authorization: 'hackdappcom1@active', - broadcast: true, - sign: true -}) -const {deployContract} = require('./utils/common') - -//更改处三:改为要发布的合约帐户名称 -deployContract(eos, { account: "hackdappcom1", contractDir: "./contracts" }).then((result) => { - console.log(`Deployment successful`, JSON.stringify(result, null , 4)) -}) -.catch(err => { - console.error(`Deployment failed`, err) -}) -``` -最后,根据自己的帐户信息进行参数更改。 - -注:deploy.js文件头引入的两个文件[eossdk](https://gist.github.com/hackdapp/246bc1b9998e7f0f5b12b04a96585081)、[common.js](https://gist.github.com/hackdapp/b200b70b1e5d32fa9e7ae1fc082681cc)可直接点击链接下载,并放入工程目录utils文件夹中。 - -#### 执行合约发布 -编辑完成deploy.js相关参数数据, 通过node命令进行合约发布。 -```bash -node deploy.js -``` -运行命令之后,如果发布成功,会显示以下日志信息: -```bash -Deployment successful -[ - { - "broadcast": true, - "transaction": { - "compression": "none", - "transaction": { - "expiration": "2019-04-03T06:50:55", - "ref_block_num": 25564, - "ref_block_prefix": 1344811314, - "max_net_usage_words": 0, - "max_cpu_usage_ms": 0, - "delay_sec": 0, - "context_free_actions": [], -...... - "account_ram_deltas": [ - { - "account": "hackdappcom1", - "delta": -27 - } - ], - "except": null, - "inline_traces": [] - } - ], - "except": null - } - } -] -``` - -### 4. 合约调用 -在确保合约发布成功之后,开始编写合约调用文件 invoke.js -```bash -~> touch invoke.js -``` - -打开invoke.js, 填入以下代码: -```bash -const eos = require('./utils/eossdk')({ - chainId: "e70aaab8997e1dfce58fbfac80cbbb8fecec7b99cf982a9444273cbc64c41473", - httpEndpoint: "http://jungle2.cryptolions.io:80", - keyProvider: "5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu", - authorization: 'hackdappcom1@active', - broadcast: true, - sign: true -}) - -const data = { - actions: [ - { - account: 'hackdappcom1', - name: 'hi', - authorization: [{ - actor: 'hackdappcom1', - permission: 'active' - }], - data: {"user": "222"} - } - ] -} -eos.transaction(data).then((result)=>{ - console.log(JSON.stringify(result.processed.action_traces[0].console, null, 4)) - }).catch((err)=>{ - console.log(err) - }) -``` - -执行调用命令 -```bash -node invoke.js -``` -如果能够正常运行,则会显示以下内容信息 -```bash -"Hello, 222" - - -``` - -另外,针对教程中出现的代码,我提供了完整的工程代码示例及文字稿教程。大家可点击链接或者直接克隆到本地进行查看。项目地址: [https://github.com/hackdapp/learn\_eos](https://github.com/hackdapp/learn_eos) - ----- - -## **可能出现的问题**: -1. 如果你没有事先购买RAM资源,可以会提示以下错误信息 - ```bash - { - "code": 500, - "message": "Internal Service Error", - "error": { - "code": 3080001, - "name": "ram_usage_exceeded", - "what": "Account using more than allotted RAM usage", - "details": [ - { - "message": "account hackdappcom1 has insufficient ram; needs 26318 bytes has 5471 bytes", - "file": "resource_limits.cpp", - "line_number": 213, - "method": "verify_account_ram_usage" - } - ] - } - } - ``` - - - -## 测试网帐号 - -|帐户名 |公钥 |私钥 | -|:--- |:--- |:--- | -| hackdappcom1 | EOS6LTWfM5ffbmjUhvwFnrU5QEBrmkzsRo2eXogr2h9oP8DUuzgAi | 5JxqGao9rzXWBUDnNzALyxaFdmZYXiZ46EzHL4sJkHkryzCFKxu | -| hackdappcom2 | EOS6qCqbFLuYK5rGK9LDPzcboLqy4phrUxLXLrhLgXxVBpzLzsJke | 5Jnw2anG8Zzy6MuCNxvwmaX5Hu4B6de1uzuae5QyRrUFtyfL2Wo | -| hackdappcom3 | EOS57B3rxRBBUiTyZf9iBxsWyQnvEhq2H95wbBbjdzcLbV1gfJ4zy | 5Ju2NNc24q3jQ2Yc2JcvwWjtGVeAyuWcNsaNVb37u7cmRW56zgc | -| hackdappcom4 | EOS7i5Diz2uqXSpvutmV4DftBRrL1XASzxsSdWBGrgzngPoXhT2dk | 5K6nyWMvpfYnQqLhS545dm53exduJgDBLHMYQ6SCNaPmeHjGZdr | -| hackdappcom5 | EOS6NcaFvvoekuBjhZLsBVywiMcN7VTVmgvAdA5srgTvQMeDmdiAH | 5JjN9efKokkgZYno2qjbE9C7WCGbVpPvgNArKDvcjbDic2pRGCS | - -## 参考资料 -1. [https://nadejde.github.io/eos-token-sale/](https://nadejde.github.io/eos-token-sale/) -2. [http://monitor.jungletestnet.io/#home](http://monitor.jungletestnet.io/#home) -3. [https://jungle.eosx.io/tools/ram/buy?symbol=10](https://jungle.eosx.io/tools/ram/buy?symbol=10) -4. [https://github.com/hackdapp/learn\_eos](https://github.com/hackdapp/learn_eos) -5. [https://chrome-extension-downloader.com/f944f5bf7bc58292048aa5b9bf29dc48/scatter.crx.crx.crx](https://chrome-extension-downloader.com/f944f5bf7bc58292048aa5b9bf29dc48/scatter.crx.crx.crx) - - ----- -到此,整个EOS合约开发的流程就算介绍完毕。让我们再总结一下整体操作流程: -1. 生成两对公私地址,并进行EOS帐户注册 -2. 通过jungle网站进行EOS币的领取,并对其进行余额查询 -3. 安装Scatter插件,导入私钥并绑定新身份 -4. 使用新注册的EOS帐户购买RAMCPUNET发布合约所需要的资源 -5. 创建合约测试示例并编译 -6. 编写发布合约脚本,替换合约帐户后进行合约发布 -7. 编写合约方法调用脚本,调用合约中的hi方法进行日志打印。 -通过七个步骤我们了解了整个EOS合约开发的最简化操作流程。 - ------------------------------------------------------------------------------------------------------------- -**欢迎关注HackDApp博客或公众号**, HackHook将持续为你分享IndieMaker成长路径、DAPP技术知识、高效Mac使用技巧、底层思维认知。 ------------------------------------------------------------------------------------------------------------- -我的博客: https://www.hackdapp.com/ -我的github: https://github.com/hackdapp -我的哔哩哔哩: https://space.bilibili.com/17360859 -我的微信公众号: hackdapp -![](http://cdn.hackdapp.com/2019-04-03-mysign.jpg) -IndieMakers: https://www.indiemakers.cn ------------------------------------------------------------------------------------------------------------- -联系邮箱:55269778@qq.com diff --git "a/source/_posts/20210221-\345\246\202\344\275\225\346\217\220\351\253\230\346\224\266\347\233\212\351\243\216\351\231\251\346\257\224.md" "b/source/_posts/20210221-\345\246\202\344\275\225\346\217\220\351\253\230\346\224\266\347\233\212\351\243\216\351\231\251\346\257\224.md" deleted file mode 100644 index b42c41af..00000000 --- "a/source/_posts/20210221-\345\246\202\344\275\225\346\217\220\351\253\230\346\224\266\347\233\212\351\243\216\351\231\251\346\257\224.md" +++ /dev/null @@ -1,21 +0,0 @@ ---- -title: 如何提高收益风险比 -categories: 投资 -url: how-to-improve-return-risk-ratio -tags: 投资 -keywords: 数据货币 投资策略 -abbrlink: 57136 -date: 2021-02-21 20:56:11 ---- - -什么是收益风险比呢? 字面意思不难理解,就是: 收益风险比 = 可能的收益 / 未知的风险。 - -为什么需要认识并提升自己的收益风险比呢? 因为像我这样打工人,除了工资之外,就没有其他收入了,如果被辞职或家里出些什么事,无论是家庭生活质量还是自己的心理焦虑,都会受到极大的生存压力。而投资作为被动收入的一种手段,就可以提升我们在工作单一收入上的安全度,而提升收益风险比,就是在这一基础上能够获得更大的回报。 - -那么如何提高收益风险比呢?很简单: -一、提高分子值,即:让自己的可能收益的概率更高。那么如何做到呢?比如:筛选优质投资标的;选择合适的投资时机;长线持有,防止频繁操作,被甩下车的可能; -二、降低分母值,即:降低投资对自己生活的风险影响程度。如何做呢?比如:设置止损线,尽量让损失控制在自己可以接受的心理价位;按自己的风险承受能力,设置投资金额占总资产的百分比;增加场外赚钱能力,充沛的现金流在一定程序上可以降低自己的投资焦虑。 - -通过合理的收益风险比的控制,可以让我们在整个投资过程中,除了降低一些心理焦虑压力,还能获取更高的投资回报,并最终提升我们的家庭生活质量以及风险承受能力。 - -2021年,希望自己在数字货币投资领域,能够有个好的收获! diff --git "a/source/_posts/20210228-\344\272\244\346\230\223\350\200\205\345\272\224\346\216\214\346\217\241\347\232\204\350\203\275\345\212\233.md" "b/source/_posts/20210228-\344\272\244\346\230\223\350\200\205\345\272\224\346\216\214\346\217\241\347\232\204\350\203\275\345\212\233.md" deleted file mode 100644 index 84c3fa25..00000000 --- "a/source/_posts/20210228-\344\272\244\346\230\223\350\200\205\345\272\224\346\216\214\346\217\241\347\232\204\350\203\275\345\212\233.md" +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: 交易者应掌握的能力 -categories: 认知 -tags: 认知 -keywords: 认知 -abbrlink: 111 -date: 2021-02-28 18:02:54 -url: 2021-02-28 00:00:00 ---- - -无论是在股市或是币市,我们都希望通过自己的一顿神操作,买到那些可以让自己瞬间反几倍甚至几十倍的股票或数字货币,但现实情况 -会告诉你,即使是牛市你也能亏钱亏的要死。 - - -为什么呢?这就不得不想想其中你想赚钱的行为,是一种投机还是投资? - -投机呢,完全可能就是全凭着几个火热大群的fomo情绪,亦或是好巧不巧的几个自己认为重要的小道消息,就认为自己拿到了人生财富密码,知道自己输的底朝天;而投资往往是通过自己对标的物,花精力与时间去研究思考,挖机出它的长期价值,尤其是那些被低估的标的,即使是自己决策失误,也会总结教训,从错误中反思,改进自己的投资方法论,不错失提升自己大脑🧠成长的机会。 - -韭菜之所以是韭菜,就因为再每一次决策失误的时候不去学习反思,丧失了每一次成长的机会,慢慢就变成了一根老韭菜。 - -所以,在赚钱这条路上,我们慢慢培养总结自己的投资方法论,并在实践过程中不断反思复盘完善自己的投资逻辑。 - -> 思考带来决策,决策带来行动,行动改变命运,,行动改变命运! - - diff --git a/source/_posts/20210407-how-to-write-ad-fast.md b/source/_posts/20210407-how-to-write-ad-fast.md deleted file mode 100644 index c4789a1b..00000000 --- a/source/_posts/20210407-how-to-write-ad-fast.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: 如何用61分钟写出漂亮的推广文案 -categories: Write -abbrlink: 65535 -date: 2021-04-07 18:09:14 -url: how_to_write_ad_fast -tags: -description: - - 如何用最少的时间写出最漂亮的广告推广文案呢?今天就向你推荐一个写作框架。 - - 点击【ReadMore】,了解更多详情。 - -keywords: ---- - -最近,接触了不少通过推荐产品的联盟推广平台,只要你能通过自己的语言或文字,说服别人通过你的链接购买对应商品,那么你就能从中抽取一定的佣金。比如:将京东或淘宝联盟里的产品,通过知乎、蜜源、小红书等平台进行文案宣传。 - -在推广过程,你会很快发现,如何能够更好的说报用户,就往往就要考虑一个人的文案能力,当然不仅仅是文字功度,更重要的是你更懂得将适当的产品推送给最需要的人。这其中,就需要你多思考,如何挖掘产品卖点,如何通过数据了解客户需要什么等等。 - -对于一些专门写广告文案的高手来讲,往往都有一套自己的写作套路或者方法论,以提高自己的产出效率及效果。最终考验你的不是你写了多少字,而是到底转化多少用户进行付费。 - -今天,也是机缘巧合,刷推的时候发现一篇推文觉得写得挺不错的,所以也翻译过来与大家共同学习成长。 - -推主的整个写作框架,共拆分成11个小步骤,来实现“花最小的努力产出最好的效果”。 - -### 01/ 花10分钟, 收集广告主资料 -了解你所要推广产品的广告主是谁,经营什么产品,产品解决什么问题,这一切只需要你从对方官网都可以快速了解。除了你从广告主直接获取的信息之外,你还需要通过Google检索与之相竞争的对手与产品是什么。 - -### 02/ 花5分钟,阅读广告主介绍 -好好阅读上一步骤所收集到的广告主资料信息。想一想,如果广告主找你聊具体的推广信息,而你对自己的客户一无所知,是不是有点说不过去,所以要提前做好功课。 - -### 03/ 花5分钟,找到一个卖点 -你要明白每一个产品往往都会有很多优点或者好处,你不可能使用有限的篇幅来顾及所有信息。所以,你需要依照自己的推广平台的文字限制,来选择性的介绍1个或多个产品卖点。 - -### 04/ 花1分钟,确定CTA -通过添加CTA(Call to action)链接或按钮,可以更容易说服用户采取下一步行动,有利于促进点击率或转化率。CTA要具备三个要素:要推广人们立即行动,而不是晚点再说;应该要求行动,而不是建议行动;引导人们行动的流程要足够简单。 - -比如:错误示例,“LearnMore”,“Download”,没有告诉用户所要获得的好处;好的示例,“Get My Free EBook”、“Get 50% Off My Ebook Now” - -### 05/ 花10分钟,持续输出文字 -通过之前对于广告主及产品的了解、选定的推广卖点以及CTA等多方面的了解,用自己的文字进行快速组织介绍,把所有能想到的文字尽量输出出来,不要担心写的好不好,通顺不通顺,你可以理解为列草稿。 - -### 06/ 花10分钟,将自己的头脑冷静一下 -对于刚输出的内容,自己的思维可能一直处于一种惯性思维之中。试着将这种思维冷却下来,才可能更加理性的看待问题。 - -### 07/ 花6分钟,重新省视自己的文案 -你可以通过大声朗读自己的文案,以及换位思考,假如你是读者,感受如何。另外,尽量使用客户有依据的数字来支撑你的表达,从而提升说服力。 - -### 08/ 花6分钟,检查自己的表达逻辑 -检查自己方案的表达逻辑是否合理,以及学会在适当的位置进行段落,可以减轻用户的阅读障碍。如何不知道写符合逻辑的推广文案,可以学习一下[aida(营销模式)_百度百科](https://baike.baidu.com/item/aida/19650301?fr=aladdin) - -### 09/ 花8分钟,优化文案 -检查自己的文案,是否存在不通顺、措词不当以及存在错别字的情况,把自己的每一段文案当成一个产品进行精打细磨。 - -### 10/ All done -到这一步,你能做都已经做了,剩下的就只能看广告在市场中的具体表现效果了。 - -而你呢,接下来所要做的事情,就是继续写一篇文案,以此往复,不断提高自己“Writing-》Sell”的文案能力。 - -## 参考资料 -- [CTA设置11法则,帮卖家提升产品点击率和转化率-雨果网](https://www.cifnews.com/article/28761) -- [(2) Kolby Hatch 在 Twitter: "Great writing can be fast. I’ve written 1,007 ads for @thehustle That’s in the ballpark of 250 different startups. At 150 words an ad, it's a LOT of writing. You learn to write fast. Here's my framework for writing a great ad in 61 minutes w/minimal effort 👇" / Twitter](https://twitter.com/HatchKolby/status/1379557621120794628?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1379590804730126337%7Ctwgr%5E%7Ctwcon%5Es3_&ref_url=https%3A%2F%2Froamresearch.com%2F%2Fapp%2FHackLabs) diff --git "a/source/_posts/20210428-\345\246\202\344\275\225\346\217\220\351\253\230\351\230\262\347\214\235\346\255\273\347\232\204\350\203\275\345\212\233.md" "b/source/_posts/20210428-\345\246\202\344\275\225\346\217\220\351\253\230\351\230\262\347\214\235\346\255\273\347\232\204\350\203\275\345\212\233.md" deleted file mode 100644 index f57d95e7..00000000 --- "a/source/_posts/20210428-\345\246\202\344\275\225\346\217\220\351\253\230\351\230\262\347\214\235\346\255\273\347\232\204\350\203\275\345\212\233.md" +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: 如何提高防猝死的能力 -categories: 心脏医学课 -url: 20210428-如何提高防猝死的能力 -tags: 防猝死 得到课程 心脏医学课 -keywords: 防猝死 得到课程 心脏医学课 -abbrlink: 20846 -date: 2021-04-28 22:56:16 ---- - -**猝死就是平时身体健康、或貌似健康的患者,在出乎意料的短时间内,因自然疾病而突然死亡.** - -**猝死,如此可怕,是哪些原因导致的呢?** -85%是心血管问题,这其中,又有80%是给心脏供血的冠状动脉突发缺血了。 - -**那么,猝死我们可以预防或控制吗?** -好消息是,绝大部分情况可以,前提是你要有足够的心脏储备。而储备,是心血管健康里最容易被忽视的一个维度。所谓心力储备,就是心脏因身体的需要而增加射血的能力。所以,大部分情况下,猝死是由于心力储备坍塌导致的。 - -**逻辑上有三种策略可以进行预防:** - -1. 避免最后一根稻草策略。能引发猝死的事情,我们不要去做。比如: 大量喝酒或咖、心情抑郁、暴饮暴食等等。要注重先兆,要比发现最后一稻草更有效; -2. 关注身体信号策略。我们要注意引发猝死的先兆,也就是去注意储备透支的信号。 -3. 拓展储备策略。这也是最重要的一种策略。既然储备是一种潜能,那我们就要努力去拓展它 - -原文链接: https://www.dedao.cn/article/w06eGYrQb1gzVxBryXPl73kZRqOaB8 - diff --git "a/source/_posts/\345\237\272\344\272\216\344\273\245\345\244\252\345\235\212\347\232\204NFT\345\274\200\345\217\221\345\256\236\350\267\265.md" "b/source/_posts/\345\237\272\344\272\216\344\273\245\345\244\252\345\235\212\347\232\204NFT\345\274\200\345\217\221\345\256\236\350\267\265.md" deleted file mode 100644 index 5c2bc4f3..00000000 --- "a/source/_posts/\345\237\272\344\272\216\344\273\245\345\244\252\345\235\212\347\232\204NFT\345\274\200\345\217\221\345\256\236\350\267\265.md" +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: 基于以太坊的NFT开发实践 -categories: 以太坊课程 -abbrlink: 25779 -date: 2021-06-28 23:22:28 -url: how-to-impl-nft-proj -tags: nft ethereum truffle javascript -keywords: nft ethereum truffle javascript ---- - -## 课程大纲 - -### 第一部分、项目总览 - -- 项目产品介绍 -- 代码工程介绍 -- 技术架构讲解 -- 基础概念讲解(ERC20、ERC1155、ERC721) - -### 第二部分、产品架构及功能设计 - -- 产品架构图 -- 业务流程图 -- 技术架构图 - -### 第三部分、产品开发及用例测试 - -#### 1)智能合约开发 - -- 基础环境配置 -- 搭建本地链环境 -- 开发工程构建 -- 合约设计 -- 合约测试 - -#### 2)IPFS部署与集成 -#### 3)前端页面开发 - -### 第四部分、产品部署 - -- 发布静态工程至github仓库gh-page,并配置公网域名 -- 发布智能合约至测试网 - -### 第五部分、线上演示及功能验证 - -- 安装MetaMask -- 发布NFT -- 交易NFT -- 转帐NFT -- ...... - diff --git "a/source/_posts/\345\246\202\344\275\225\345\201\232\345\245\275\350\257\276\345\240\202\347\254\224\350\256\260.md" "b/source/_posts/\345\246\202\344\275\225\345\201\232\345\245\275\350\257\276\345\240\202\347\254\224\350\256\260.md" deleted file mode 100644 index 1b62bc28..00000000 --- "a/source/_posts/\345\246\202\344\275\225\345\201\232\345\245\275\350\257\276\345\240\202\347\254\224\350\256\260.md" +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: 如何做好课堂笔记 -categories: 知识卡片 -url: how-to-make-goodnotes -abbrlink: 28571 -date: 2021-06-07 17:24:31 -tags: -keywords: ---- - -![](http://cdn.hackdapp.com/2021-06-07-%E5%BF%85%E4%BF%AE%E4%BD%9C%E4%B8%9A1-D023-%E5%BC%A0%E4%BA%AE-%E5%8C%97%E4%BA%AC-hackdapp.png) diff --git "a/source/_posts/\347\256\200\345\215\225\347\250\213\345\272\217\345\205\245\351\227\250.md" "b/source/_posts/\347\256\200\345\215\225\347\250\213\345\272\217\345\205\245\351\227\250.md" deleted file mode 100644 index 4f03e800..00000000 --- "a/source/_posts/\347\256\200\345\215\225\347\250\213\345\272\217\345\205\245\351\227\250.md" +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: C++简单程序入门 -categories: EOS完全开发指南 -url: simple_cpllus_code -tags: - - EOS完全开发指南 -keywords: - - EOS完全开发指南 -description: - - C++简单程序入门. 以最简单的示例代码,为你拆解其脉络结构。上手C++对你来说,那不是难事。 -abbrlink: 43137 -date: 2019-04-04 12:00:00 ---- - - -``` - /* filename: myapp.cpp - date: 2019-01-28 3:06 PM - auth: 55269778@qq.com */ - - #include //定义头文件 - #include - - int main() - { - using namespace std; //命令空间, 简化后续变量或方法调用。e.g. std::string 等同于 string - - string msg = "hi, my first dapp"; //定义变量 - - cout << msg <` - -头文件定义主要用于引用第三方函数库,通过调用第三方函数可以减少开发代码量,提高开发效率,同时也避免了不必要的重复造轮子。 - -比如:通过引用\库,可以帮助我们快速使用里面的函数进行一些数学运算。 - -![](https://ws3.sinaimg.cn/large/006tNc79ly1fzmer35re6j30l30j6myt.jpg) - -所以,后续我们需要学会便是如何查阅C -## 2. `int main()` -`main`函数区别于其它普通函数之处在于: main函数默认被系统定义为应用入口调用方法。除此之外,与其他函数无任何区别。 - - #include - #include - - using namespace std; - - string sayHi(string username) - { - return string("hi, ").append(username).append("!"); - } - - int main() - { - cout << sayHi("www.hackdapp.com") < 方法名(参数定义1, 参数定义2,参数定义...) - { - //do some stuff - return <返回数据> - } - -如果你之前已经在使用其他编程语言,那么应该对于C++其实也可以很好的理解它的程序结构。 - -注: 后续我们会详细介绍函数的多种定义及使用方式,包括形参实参、重载以及虚函数等。 - -## 3. `string message = "hi, my first app"` -变量定义,在程序开发过程,往往需要定义一些临时变量,用于存储在数据逻辑处理过程所必须的临时存储。 - -而变量的类型,主要分为字符、整型,长/短整型、单精度、双精度、布尔类型以及字符串。 -我们在实际应用场景中,需要明确了解与知道这些基础数据类型的定义及边界范围,比如,无符号整型、单精度。 - -尤其是对数字类型的字段,如果不了解其边界范围,很可能会导致运算溢出等问题,特别是在合约开发过程中,数字溢出很可能导致的便是相当大的经济损失。 - -换个角度讲,合理的使用变量类型,也可能在一定程序中节省资源的浪费。因为在EOS合约中存储数据是需要消耗资源的。 - -另外,对于变量的名称定义,其名称只能是由数字、字母以及下划线组成且不可能以数字开头,而且根据不同平台,对于名称的长度其实也是存在限制的。 - -## 4. `cout << msg < - ----- - -## 工具网站 - -1. 简历制作 - https://www.kickresume.com - ![](http://cdn.hackdapp.com/2019-03-21-135402.jpg) - -2. diff --git a/source/tools/index.md b/source/tools/index.md deleted file mode 100644 index f9d0240b..00000000 --- a/source/tools/index.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -layout: single-column -disallow: true ---- - -http://joinwee.com/lesson/20/#4 - -https://www.damengxiang.me/categories/all.html \ No newline at end of file diff --git a/source/weekly/index.md b/source/weekly/index.md deleted file mode 100644 index 38b5101f..00000000 --- a/source/weekly/index.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: single-column -title: 学习周报⏳ -keywords: - - 学习周报 - - hackdapp学习周报 - - hackdapp分享 - - 周报分享 -description: - - 学习周报栏目,与你分享与当周所收集的各种价值信息资源,当然不仅限于高质量知识、工具技巧,还包括书籍推荐📘️、技术教程、VLOG🎦️、⌨️DIY硬件。 ---- - -> 与你分享与当周所收集的各种价值信息资源,当然不仅限于高质量知识、工具技巧,还包括书籍推荐📘️、技术教程、VLOG🎬️、⌨️DIY硬件。 - -[wiki.hackdapp.com](https://wiki.hackdapp.com/#/looking-back/looking-back) diff --git a/source/wiki/index.md b/source/wiki/index.md deleted file mode 100644 index 312fda89..00000000 --- a/source/wiki/index.md +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: single-column -disallow: true ---- \ No newline at end of file diff --git a/themes/maupassant b/themes/maupassant deleted file mode 160000 index 656e204f..00000000 --- a/themes/maupassant +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 656e204ff6a893a6e95985fc613c3c71d3ccf4b9 diff --git a/things/index.html b/things/index.html new file mode 100644 index 00000000..1627cae0 --- /dev/null +++ b/things/index.html @@ -0,0 +1,36 @@ +好物推荐☂ | HackDApp

    好物推荐☂

    与你分享我自己常年在用的效率工具与workflow,会根据自己的周报收获持续更新。HackDApp愿与你分享!

    +
    +

    输入法

    鼠须管配置方案(五笔方案): https://github.com/hackdapp/Rime
    效果图
    注:时隔多年鼠须管终于来了一次升级,后果就是本地原有方案报错无法使用,所以自己又重新折腾了一番。

    +

    桌面控件

    效果图

    +
      +
    1. 歐陽娜娜Nana OuYang
    2. +
    + + +
    +

    工具网站

      +
    1. 简历制作
      https://www.kickresume.com
    2. +
    +

    2.

    +
    \ No newline at end of file diff --git a/tools/index.html b/tools/index.html new file mode 100644 index 00000000..76daf1bc --- /dev/null +++ b/tools/index.html @@ -0,0 +1,24 @@ + | HackDApp

    http://joinwee.com/lesson/20/#4

    +

    https://www.damengxiang.me/categories/all.html

    +
    \ No newline at end of file diff --git a/weekly/index.html b/weekly/index.html new file mode 100644 index 00000000..ff0fa9cf --- /dev/null +++ b/weekly/index.html @@ -0,0 +1,26 @@ +学习周报⏳ | HackDApp

    学习周报⏳

    +

    与你分享与当周所收集的各种价值信息资源,当然不仅限于高质量知识、工具技巧,还包括书籍推荐📘️、技术教程、VLOG🎬️、⌨️DIY硬件。

    +
    +

    wiki.hackdapp.com

    +
    \ No newline at end of file diff --git a/wiki/index.html b/wiki/index.html new file mode 100644 index 00000000..2282d8c0 --- /dev/null +++ b/wiki/index.html @@ -0,0 +1,22 @@ + | HackDApp

    \ No newline at end of file diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index d426d7bf..00000000 --- a/yarn.lock +++ /dev/null @@ -1,4273 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/babel-types@*", "@types/babel-types@^7.0.0": - version "7.0.9" - resolved "https://registry.npm.taobao.org/@types/babel-types/download/@types/babel-types-7.0.9.tgz#01d7b86949f455402a94c788883fe4ba574cad41" - integrity sha1-Ade4aUn0VUAqlMeIiD/kuldMrUE= - -"@types/babylon@^6.16.2": - version "6.16.5" - resolved "https://registry.npm.taobao.org/@types/babylon/download/@types/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4" - integrity sha1-HFZB22nrjN83jt0ltL53VL7rSLQ= - dependencies: - "@types/babel-types" "*" - -JSONStream@^1.0.7: - version "1.3.5" - resolved "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha1-MgjB8I06TZkmGrZPkjArwV4RHKA= - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -a-sync-waterfall@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" - integrity sha1-dba2qnJZi0l6El56J3DxT0yKH6c= - -abbrev@1, abbrev@^1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= - -accepts@~1.3.5: - version "1.3.7" - resolved "https://registry.npm.taobao.org/accepts/download/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - -acorn-globals@^3.0.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/acorn-globals/download/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= - dependencies: - acorn "^4.0.4" - -acorn@^3.1.0: - version "3.3.0" - resolved "https://registry.npm.taobao.org/acorn/download/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - -acorn@^4.0.4: - version "4.0.13" - resolved "https://registry.npm.taobao.org/acorn/download/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= - -acorn@^6.1.1: - version "6.4.2" - resolved "https://registry.npm.taobao.org/acorn/download/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha1-NYZv1xBSjpLeEM8GAWSY5H454eY= - -acorn@~2.7.0: - version "2.7.0" - resolved "https://registry.npm.taobao.org/acorn/download/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" - integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= - -ajv@^6.12.3: - version "6.12.6" - resolved "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc= - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz?cache=0&sync_timestamp=1617175724482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz?cache=0&sync_timestamp=1617175724482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fansi-styles%2Fdownload%2Fansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= - dependencies: - color-convert "^1.9.0" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - integrity sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo= - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -anymatch@~3.1.1: - version "3.1.2" - resolved "https://registry.npm.taobao.org/anymatch/download/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha1-wFV8CWrzLxBhmPT04qODU343hxY= - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.npm.taobao.org/aproba/download/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha1-aALmJk79GMeQobDVF/DyYnvyyUo= - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.npm.taobao.org/are-we-there-yet/download/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha1-SzXClE8GKov82mZBB2A1D+nd/CE= - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npm.taobao.org/argparse/download/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/arr-diff/download/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/arr-union/download/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npm.taobao.org/array-unique/download/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asap@^2.0.3, asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= - -asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/assign-symbols/download/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.0, async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.npm.taobao.org/async-each/download/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= - -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.npm.taobao.org/async-foreach/download/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - -async@~0.2.6: - version "0.2.10" - resolved "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" - integrity sha1-trvgsGdLnXGXCMo43owjfLUmw9E= - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/atob/download/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.npm.taobao.org/aws4/download/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-code-frame/download/babel-code-frame-6.26.0.tgz?cache=0&sync_timestamp=1612181667818&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbabel-code-frame%2Fdownload%2Fbabel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-eslint@^7.2.1: - version "7.2.3" - resolved "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" - integrity sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc= - dependencies: - babel-code-frame "^6.22.0" - babel-traverse "^6.23.1" - babel-types "^6.23.0" - babylon "^6.17.0" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.npm.taobao.org/babel-messages/download/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-runtime/download/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-traverse@^6.23.1: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-traverse/download/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.23.0, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.npm.taobao.org/babel-types/download/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.17.0, babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.npm.taobao.org/babylon/download/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha1-ry87iPpvXB5MY00aD46sT1WzleM= - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbalanced-match%2Fdownload%2Fbalanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npm.taobao.org/base/download/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -basic-auth@~2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/basic-auth/download/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo= - dependencies: - safe-buffer "5.1.2" - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.13.1.tgz?cache=0&sync_timestamp=1610299754511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-2.2.0.tgz?cache=0&sync_timestamp=1610299754511&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbinary-extensions%2Fdownload%2Fbinary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0= - -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.npm.taobao.org/bindings/download/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= - dependencies: - file-uri-to-path "1.0.0" - -block-stream@*: - version "0.0.9" - resolved "https://registry.npm.taobao.org/block-stream/download/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - -bluebird@^3.2.2, bluebird@^3.4.0, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.3: - version "3.7.2" - resolved "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1598277393637&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= - -boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz?cache=0&sync_timestamp=1614011092368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbrace-expansion%2Fdownload%2Fbrace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.npm.taobao.org/braces/download/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/braces/download/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha1-NFThpGLujVmeI23zNs2epPiv4Qc= - dependencies: - fill-range "^7.0.1" - -browser-fingerprint@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/browser-fingerprint/download/browser-fingerprint-0.0.1.tgz#8df3cdca25bf7d5b3542d61545d730053fce604a" - integrity sha1-jfPNyiW/fVs1QtYVRdcwBT/OYEo= - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/cache-base/download/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/call-bind/download/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz?cache=0&sync_timestamp=1606867639877&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M= - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camel-case@^4.0.0: - version "4.1.2" - resolved "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.2.tgz?cache=0&sync_timestamp=1606867639877&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamel-case%2Fdownload%2Fcamel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha1-lygHKpVPgFIoIlpt7qazhGHhvVo= - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= - -camelcase@^2.0.0, camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.npm.taobao.org/camelcase/download/camelcase-5.3.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcamelcase%2Fdownload%2Fcamelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA= - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz?cache=0&sync_timestamp=1599533182233&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1599533182233&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -character-parser@^2.1.1: - version "2.2.0" - resolved "https://registry.npm.taobao.org/character-parser/download/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= - dependencies: - is-regex "^1.0.3" - -cheerio@0.22.0: - version "0.22.0" - resolved "https://registry.npm.taobao.org/cheerio/download/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" - integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4= - dependencies: - css-select "~1.2.0" - dom-serializer "~0.1.0" - entities "~1.1.1" - htmlparser2 "^3.9.1" - lodash.assignin "^4.0.9" - lodash.bind "^4.1.4" - lodash.defaults "^4.0.1" - lodash.filter "^4.4.0" - lodash.flatten "^4.2.0" - lodash.foreach "^4.3.0" - lodash.map "^4.4.0" - lodash.merge "^4.4.0" - lodash.pick "^4.2.1" - lodash.reduce "^4.4.0" - lodash.reject "^4.4.0" - lodash.some "^4.4.0" - -chokidar@^1.5.2, chokidar@^1.6.0: - version "1.7.0" - resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz?cache=0&sync_timestamp=1610719510785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - integrity sha1-eY5ol3gVHIB2tLNg5e3SjNortGg= - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -chokidar@^2.0.4: - version "2.1.8" - resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-2.1.8.tgz?cache=0&sync_timestamp=1610719510785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chokidar@^3.0.0: - version "3.5.1" - resolved "https://registry.npm.taobao.org/chokidar/download/chokidar-3.5.1.tgz?cache=0&sync_timestamp=1610719510785&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchokidar%2Fdownload%2Fchokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha1-7pznu+vSt59J8wR5nVRo4x4U5oo= - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.5.0" - optionalDependencies: - fsevents "~2.3.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npm.taobao.org/class-utils/download/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-css@^3.3.0: - version "3.4.28" - resolved "https://registry.npm.taobao.org/clean-css/download/clean-css-3.4.28.tgz?cache=0&sync_timestamp=1616153455026&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fclean-css%2Fdownload%2Fclean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" - integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= - dependencies: - commander "2.8.x" - source-map "0.4.x" - -clipboard@^2.0.0: - version "2.0.8" - resolved "https://registry.npm.taobao.org/clipboard/download/clipboard-2.0.8.tgz#ffc6c103dd2967a83005f3f61976aa4655a4cdba" - integrity sha1-/8bBA90pZ6gwBfP2GXaqRlWkzbo= - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.npm.taobao.org/cliui/download/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U= - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha1-xQclrzgIyKsCYP1gsB+/oluVT2k= - -commander@2.8.x: - version "2.8.1" - resolved "https://registry.npm.taobao.org/commander/download/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= - dependencies: - graceful-readlink ">= 1.0.0" - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/commander/download/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha1-Rqu9FlL44Fm92u+Zu9yyrZzxea4= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npm.taobao.org/component-emitter/download/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npm.taobao.org/compressible/download/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha1-r1PMprBw1MPAdQ+9dyhqbXzEb7o= - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.3: - version "1.7.4" - resolved "https://registry.npm.taobao.org/compression/download/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha1-lVI+/xcMpXwpoMpB5v4TH0Hlu48= - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -connect@^3.6.6: - version "3.7.0" - resolved "https://registry.npm.taobao.org/connect/download/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg= - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/console-control-strings/download/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constantinople@^3.0.1: - version "3.1.2" - resolved "https://registry.npm.taobao.org/constantinople/download/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" - integrity sha1-1F7XJPV9PRBQABen06iJwTga5kc= - dependencies: - "@types/babel-types" "^7.0.0" - "@types/babylon" "^6.16.2" - babel-types "^6.26.0" - babylon "^6.18.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/copy-descriptor/download/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js@^1.1.1: - version "1.2.7" - resolved "https://registry.npm.taobao.org/core-js/download/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.npm.taobao.org/core-js/download/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw= - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^4.0.0: - version "4.0.2" - resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - -cross-spawn@^7.0.0: - version "7.0.3" - resolved "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha1-9zqFudXUHQRVUcF34ogtSshXKKY= - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-parse@1.7.x: - version "1.7.0" - resolved "https://registry.npm.taobao.org/css-parse/download/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" - integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs= - -css-parse@~2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/css-parse/download/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4" - integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q= - dependencies: - css "^2.0.0" - -css-select@~1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" - integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg= - dependencies: - boolbase "~1.0.0" - css-what "2.1" - domutils "1.5.1" - nth-check "~1.0.1" - -css-what@2.1: - version "2.1.3" - resolved "https://registry.npm.taobao.org/css-what/download/css-what-2.1.3.tgz?cache=0&sync_timestamp=1615262748034&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcss-what%2Fdownload%2Fcss-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" - integrity sha1-ptdgRXM2X+dGhsPzEcVlE9iChfI= - -css@^2.0.0: - version "2.2.4" - resolved "https://registry.npm.taobao.org/css/download/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" - integrity sha1-xkZ1XHOXHyu6amAeLPL9cbEpiSk= - dependencies: - inherits "^2.0.3" - source-map "^0.6.1" - source-map-resolve "^0.5.2" - urix "^0.1.0" - -cuid@~1.3.8: - version "1.3.8" - resolved "https://registry.npm.taobao.org/cuid/download/cuid-1.3.8.tgz#4b875e0969bad764f7ec0706cf44f5fb0831f6b7" - integrity sha1-S4deCWm612T37AcGz0T1+wgx9rc= - dependencies: - browser-fingerprint "0.0.1" - core-js "^1.1.1" - node-fingerprint "0.0.2" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - -debug@*: - version "4.3.1" - resolved "https://registry.npm.taobao.org/debug/download/debug-4.3.1.tgz?cache=0&sync_timestamp=1607566575639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4= - dependencies: - ms "2.1.2" - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: - version "2.6.9" - resolved "https://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz?cache=0&sync_timestamp=1607566575639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= - dependencies: - ms "2.0.0" - -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/debug/download/debug-3.1.0.tgz?cache=0&sync_timestamp=1607566575639&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdebug%2Fdownload%2Fdebug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE= - dependencies: - ms "2.0.0" - -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz?cache=0&sync_timestamp=1610348622973&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdecamelize%2Fdownload%2Fdecamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/decode-uri-component/download/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npm.taobao.org/deepmerge/download/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha1-RNLqNnm49NT/ujPwPYZfwee/SVU= - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npm.taobao.org/define-property/download/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/define-property/download/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npm.taobao.org/define-property/download/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.npm.taobao.org/delegate/download/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" - integrity sha1-tmtxwxWFIuirV0T3INjKDCr1kWY= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/delegates/download/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -depd@~2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/depd/download/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8= - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -doctypes@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/doctypes/download/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E= - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -dom-serializer@^1.0.1: - version "1.2.0" - resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-1.2.0.tgz#3433d9136aeb3c627981daa385fc7f32d27c48f1" - integrity sha1-NDPZE2rrPGJ5gdqjhfx/MtJ8SPE= - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - entities "^2.0.0" - -dom-serializer@~0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0" - integrity sha1-HsQFnihLq+027sKUHUqXChic58A= - dependencies: - domelementtype "^1.3.0" - entities "^1.1.1" - -domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.1.tgz?cache=0&sync_timestamp=1617298690471&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8= - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&sync_timestamp=1617298690471&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" - integrity sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc= - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.npm.taobao.org/domhandler/download/domhandler-2.4.2.tgz?cache=0&sync_timestamp=1617299317094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha1-iAUJfpM9ZehVRvcm1g9euItE+AM= - dependencies: - domelementtype "1" - -domhandler@^3.0.0: - version "3.3.0" - resolved "https://registry.npm.taobao.org/domhandler/download/domhandler-3.3.0.tgz?cache=0&sync_timestamp=1617299317094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" - integrity sha1-bbfqRuRhfrFc+HXfaLK4UkzgA3o= - dependencies: - domelementtype "^2.0.1" - -domhandler@^4.0.0, domhandler@^4.1.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/domhandler/download/domhandler-4.1.0.tgz?cache=0&sync_timestamp=1617299317094&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomhandler%2Fdownload%2Fdomhandler-4.1.0.tgz#c1d8d494d5ec6db22de99e46a149c2a4d23ddd43" - integrity sha1-wdjUlNXsbbIt6Z5GoUnCpNI93UM= - dependencies: - domelementtype "^2.2.0" - -domutils@1.5.1: - version "1.5.1" - resolved "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz?cache=0&sync_timestamp=1617299858614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.npm.taobao.org/domutils/download/domutils-1.7.0.tgz?cache=0&sync_timestamp=1617299858614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo= - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.0.0: - version "2.5.1" - resolved "https://registry.npm.taobao.org/domutils/download/domutils-2.5.1.tgz?cache=0&sync_timestamp=1617299858614&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomutils%2Fdownload%2Fdomutils-2.5.1.tgz#9b8e84b5d9f788499ae77506ea832e9b4f9aa1c0" - integrity sha1-m46Etdn3iEma53UG6oMum0+aocA= - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.1.0" - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -ejs@^2.3.4, ejs@^2.5.5: - version "2.7.4" - resolved "https://registry.npm.taobao.org/ejs/download/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha1-SGYSh1c9zFPjZsehrlLDoSDuybo= - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.npm.taobao.org/emoji-regex/download/emoji-regex-7.0.3.tgz?cache=0&sync_timestamp=1614682725186&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Femoji-regex%2Fdownload%2Femoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -entities@^1.1.1, entities@~1.1.1: - version "1.1.2" - resolved "https://registry.npm.taobao.org/entities/download/entities-1.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha1-vfpzUplmTfr9NFKe1PhSKidf6lY= - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/entities/download/entities-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fentities%2Fdownload%2Fentities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU= - -error-ex@^1.2.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz?cache=0&sync_timestamp=1603927369482&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ferror-ex%2Fdownload%2Ferror-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= - dependencies: - is-arrayish "^0.2.1" - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npm.taobao.org/esprima/download/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npm.taobao.org/esutils/download/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/extend-shallow/download/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/extglob/download/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - -fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha1-6x53OrsFbc2N8r/favWbizqTZWU= - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npm.taobao.org/fill-range/download/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha1-GRmmp8df44ssfHflGYU12prN2kA= - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/find-up/download/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha1-SRafHXmTQwZG2mHsxa41XCHJe3M= - dependencies: - locate-path "^3.0.0" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffs.realpath%2Fdownload%2Ffs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.0.0, fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - -fsevents@~2.3.1: - version "2.3.2" - resolved "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro= - -fstream@^1.0.0, fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.npm.taobao.org/fstream/download/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha1-Touo7i1Ivk99DeUFRVVI6uWTIEU= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.npm.taobao.org/gauge/download/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.npm.taobao.org/gaze/download/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko= - dependencies: - globule "^1.0.0" - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.npm.taobao.org/get-caller-file/download/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha1-T5RBKoLbMvNuOwuXQfipf+sDH34= - -get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.npm.taobao.org/get-intrinsic/download/get-intrinsic-1.1.1.tgz?cache=0&sync_timestamp=1612364696489&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fget-intrinsic%2Fdownload%2Fget-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npm.taobao.org/get-value/download/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-parent@~5.1.0: - version "5.1.2" - resolved "https://registry.npm.taobao.org/glob-parent/download/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ= - dependencies: - is-glob "^4.0.1" - -glob@7.0.x: - version "7.0.6" - resolved "https://registry.npm.taobao.org/glob/download/glob-7.0.6.tgz?cache=0&sync_timestamp=1598275559540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^6.0.1: - version "6.0.4" - resolved "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz?cache=0&sync_timestamp=1598275559540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" - integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.6, glob@~7.1.1: - version "7.1.6" - resolved "https://registry.npm.taobao.org/glob/download/glob-7.1.6.tgz?cache=0&sync_timestamp=1598275559540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fglob%2Fdownload%2Fglob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.npm.taobao.org/globals/download/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo= - -globule@^1.0.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/globule/download/globule-1.3.2.tgz#d8bdd9e9e4eef8f96e245999a5dee7eb5d8529c4" - integrity sha1-2L3Z6eTu+PluJFmZpd7n612FKcQ= - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.npm.taobao.org/good-listener/download/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" - integrity sha1-1TswzfkxPf+33JoNR3CWqm0UXFA= - dependencies: - delegate "^3.1.2" - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4: - version "4.2.6" - resolved "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.6.tgz?cache=0&sync_timestamp=1612893309139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4= - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.npm.taobao.org/har-validator/download/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz?cache=0&sync_timestamp=1614331480805&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-ansi%2Fdownload%2Fhas-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz?cache=0&sync_timestamp=1598277394679&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-flag%2Fdownload%2Fhas-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-symbols@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/has-symbols/download/has-symbols-1.0.2.tgz?cache=0&sync_timestamp=1614443793749&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhas-symbols%2Fdownload%2Fhas-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/has-unicode/download/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npm.taobao.org/has-value/download/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/has-value/download/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/has-values/download/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/has-values/download/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= - dependencies: - function-bind "^1.1.1" - -hexo-abbrlink@^2.0.5: - version "2.2.1" - resolved "https://registry.npm.taobao.org/hexo-abbrlink/download/hexo-abbrlink-2.2.1.tgz#03a3bbf73816ed19279e97452ce617c6caf98b5a" - integrity sha1-A6O79zgW7RknnpdFLOYXxsr5i1o= - dependencies: - hexo-front-matter "^1.0.0" - hexo-fs "^3.1.0" - -hexo-bunyan@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/hexo-bunyan/download/hexo-bunyan-1.0.0.tgz#b2106b26547b232f0195db863cb5d5ff8527fd36" - integrity sha1-shBrJlR7Iy8BlduGPLXV/4Un/TY= - optionalDependencies: - moment "^2.10.6" - mv "~2" - safe-json-stringify "~1" - -hexo-cli@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-2.0.0.tgz#485b876829951886cbfc0bd20f92b745d65bc00b" - integrity sha1-SFuHaCmVGIbL/AvSD5K3RdZbwAs= - dependencies: - abbrev "^1.1.1" - acorn "^6.1.1" - bluebird "^3.5.3" - chalk "^2.4.2" - command-exists "^1.2.8" - hexo-fs "^1.0.2" - hexo-log "^0.2.0" - hexo-util "^0.6.3" - minimist "^1.2.0" - resolve "^1.10.0" - tildify "^1.2.0" - -hexo-deployer-git@^0.3.1: - version "0.3.1" - resolved "https://registry.npm.taobao.org/hexo-deployer-git/download/hexo-deployer-git-0.3.1.tgz#26b085ecc50e2cc99ecd33d56c254c5544c02d21" - integrity sha1-JrCF7MUOLMmezTPVbCVMVUTALSE= - dependencies: - babel-eslint "^7.2.1" - bluebird "^3.5.0" - chalk "^1.1.3" - hexo-fs "^0.2.0" - hexo-util "^0.6.0" - moment "^2.18.0" - swig "^1.4.2" - -hexo-front-matter@^0.2.3: - version "0.2.3" - resolved "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-0.2.3.tgz#c7ca8ef420ea36bd85e8408a2e8c9bf49efa605e" - integrity sha1-x8qO9CDqNr2F6ECKLoyb9J76YF4= - dependencies: - js-yaml "^3.6.1" - -hexo-front-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-1.0.0.tgz#0b48b1c1ed143e8cb25b3b223a9037385d910655" - integrity sha1-C0ixwe0UPoyyWzsiOpA3OF2RBlU= - dependencies: - js-yaml "^3.13.1" - -hexo-fs@^0.2.0: - version "0.2.3" - resolved "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-0.2.3.tgz#c3a81b46e457dfafc56d87c78ef114104f4a3e41" - integrity sha1-w6gbRuRX36/FbYfHjvEUEE9KPkE= - dependencies: - bluebird "^3.4.0" - chokidar "^1.5.2" - escape-string-regexp "^1.0.5" - graceful-fs "^4.1.4" - -hexo-fs@^1.0.0, hexo-fs@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-1.0.2.tgz#5eabe344a79ab68e2fa6937cc5d468129308659f" - integrity sha1-XqvjRKeato4vppN8xdRoEpMIZZ8= - dependencies: - bluebird "^3.5.1" - chokidar "^2.0.4" - escape-string-regexp "^1.0.5" - graceful-fs "^4.1.11" - -hexo-fs@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-3.1.0.tgz#2052ff72c68cda2c577a87aa0ea7980ae503fa99" - integrity sha1-IFL/csaM2ixXeoeqDqeYCuUD+pk= - dependencies: - bluebird "^3.5.1" - chokidar "^3.0.0" - graceful-fs "^4.1.11" - hexo-util "^2.0.0" - -hexo-generator-archive@^0.1.5: - version "0.1.5" - resolved "https://registry.npm.taobao.org/hexo-generator-archive/download/hexo-generator-archive-0.1.5.tgz#a979214cdddee2693e0551809c294bedadbb69b3" - integrity sha1-qXkhTN3e4mk+BVGAnClL7a27abM= - dependencies: - hexo-pagination "0.0.2" - object-assign "^2.0.0" - -hexo-generator-baidu-sitemap@^0.1.6: - version "0.1.9" - resolved "https://registry.npm.taobao.org/hexo-generator-baidu-sitemap/download/hexo-generator-baidu-sitemap-0.1.9.tgz#a9e731f95118df42f17faa3a934c6bbda821c9db" - integrity sha1-qecx+VEY30Lxf6o6k0xrvaghyds= - dependencies: - ejs "^2.5.5" - hexo "^3.0.0" - utils-merge "^1.0.0" - -hexo-generator-category@^0.1.3: - version "0.1.3" - resolved "https://registry.npm.taobao.org/hexo-generator-category/download/hexo-generator-category-0.1.3.tgz#b9e6a5862530a83bdd7da4c819c1b9f3e4ccb4b2" - integrity sha1-uealhiUwqDvdfaTIGcG58+TMtLI= - dependencies: - hexo-pagination "0.0.2" - object-assign "^2.0.0" - -hexo-generator-feed@^1.2.2: - version "1.2.2" - resolved "https://registry.npm.taobao.org/hexo-generator-feed/download/hexo-generator-feed-1.2.2.tgz#9516d1596509b157f4d044fb49b2bae398b82ba7" - integrity sha1-lRbRWWUJsVf00ET7SbK645i4K6c= - dependencies: - nunjucks "^3.0.0" - object-assign "^4.1.1" - -hexo-generator-index@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/hexo-generator-index/download/hexo-generator-index-0.2.1.tgz#9042229fcac79aaf700575da19332bf3f7ee5c5d" - integrity sha1-kEIin8rHmq9wBXXaGTMr8/fuXF0= - dependencies: - hexo-pagination "0.0.2" - object-assign "^4.0.1" - -hexo-generator-sitemap@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/hexo-generator-sitemap/download/hexo-generator-sitemap-1.2.0.tgz#3018f8d7d1e2e42b3f71a65a7316ffcf583bc3f3" - integrity sha1-MBj419Hi5Cs/caZacxb/z1g7w/M= - dependencies: - minimatch "^3.0.0" - nunjucks "^2.3.0" - object-assign "^4.0.1" - -hexo-generator-tag@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/hexo-generator-tag/download/hexo-generator-tag-0.2.0.tgz#c5715846bb41e57d9c20c1d66d7db21a1abf7a62" - integrity sha1-xXFYRrtB5X2cIMHWbX2yGhq/emI= - dependencies: - hexo-pagination "0.0.2" - object-assign "^4.0.1" - -hexo-i18n@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-0.2.1.tgz#84f141432bf09d8b558ed878c728164b6d1cd6de" - integrity sha1-hPFBQyvwnYtVjth4xygWS20c1t4= - dependencies: - sprintf-js "^1.0.2" - -hexo-log@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/hexo-log/download/hexo-log-0.2.0.tgz#d30fd45e1a12a83c88033586640485efc5df5a6f" - integrity sha1-0w/UXhoSqDyIAzWGZASF78XfWm8= - dependencies: - chalk "^1.1.1" - hexo-bunyan "^1.0.0" - -hexo-pagination@0.0.2: - version "0.0.2" - resolved "https://registry.npm.taobao.org/hexo-pagination/download/hexo-pagination-0.0.2.tgz#8cf470c7db0de5b18a3926a76deb194015df7f2b" - integrity sha1-jPRwx9sN5bGKOSanbesZQBXffys= - dependencies: - utils-merge "^1.0.0" - -hexo-renderer-ejs@^0.3.1: - version "0.3.1" - resolved "https://registry.npm.taobao.org/hexo-renderer-ejs/download/hexo-renderer-ejs-0.3.1.tgz#c0c1a3757532d47e5b7d9dc908b5dfd98c94be2c" - integrity sha1-wMGjdXUy1H5bfZ3JCLXf2YyUviw= - dependencies: - ejs "^2.3.4" - object-assign "^4.0.1" - -hexo-renderer-marked@^0.3.2: - version "0.3.2" - resolved "https://registry.npm.taobao.org/hexo-renderer-marked/download/hexo-renderer-marked-0.3.2.tgz#d6a37af9ff195e30f9ef6ede1a06ea1fe4322966" - integrity sha1-1qN6+f8ZXjD5727eGgbqH+QyKWY= - dependencies: - hexo-util "^0.6.2" - marked "^0.3.9" - object-assign "^4.1.1" - strip-indent "^2.0.0" - -hexo-renderer-pug@0.0.5: - version "0.0.5" - resolved "https://registry.npm.taobao.org/hexo-renderer-pug/download/hexo-renderer-pug-0.0.5.tgz#134031fb958321c4e7dfbd862e67b9781a11e03d" - integrity sha1-E0Ax+5WDIcTn372GLme5eBoR4D0= - dependencies: - pug "2.0.0-alpha1" - -hexo-renderer-sass@^0.3.2: - version "0.3.2" - resolved "https://registry.npm.taobao.org/hexo-renderer-sass/download/hexo-renderer-sass-0.3.2.tgz#d93106a788d4090a41890c039adbae40c7c89382" - integrity sha1-2TEGp4jUCQpBiQwDmtuuQMfIk4I= - dependencies: - node-sass "^4.5.3" - -hexo-renderer-stylus@^0.3.3: - version "0.3.3" - resolved "https://registry.npm.taobao.org/hexo-renderer-stylus/download/hexo-renderer-stylus-0.3.3.tgz#c54ea27e1fd8e3c8a9a7a84cfba8ad354122ca7f" - integrity sha1-xU6ifh/Y48ipp6hM+6itNUEiyn8= - dependencies: - nib "^1.1.2" - stylus "^0.54.5" - -hexo-server@^0.3.1: - version "0.3.3" - resolved "https://registry.npm.taobao.org/hexo-server/download/hexo-server-0.3.3.tgz#b86712974920bfcc3057debbdb35dd1be6c30080" - integrity sha1-uGcSl0kgv8wwV9672zXdG+bDAIA= - dependencies: - bluebird "^3.5.1" - chalk "^1.1.3" - compression "^1.7.3" - connect "^3.6.6" - mime "^1.6.0" - morgan "^1.9.0" - object-assign "^4.1.1" - opn "^5.3.0" - serve-static "^1.13.2" - -hexo-util@^0.6.0, hexo-util@^0.6.2, hexo-util@^0.6.3: - version "0.6.3" - resolved "https://registry.npm.taobao.org/hexo-util/download/hexo-util-0.6.3.tgz#16a2ade457bef955af0dfd22a3fe6f0a49a9137c" - integrity sha1-FqKt5Fe++VWvDf0io/5vCkmpE3w= - dependencies: - bluebird "^3.4.0" - camel-case "^3.0.0" - cross-spawn "^4.0.0" - highlight.js "^9.4.0" - html-entities "^1.2.0" - striptags "^2.1.1" - -hexo-util@^2.0.0: - version "2.4.0" - resolved "https://registry.npm.taobao.org/hexo-util/download/hexo-util-2.4.0.tgz#f5c0099a0a1718b3ad27061e5e4d1fb9eb7f2b41" - integrity sha1-9cAJmgoXGLOtJwYeXk0fuet/K0E= - dependencies: - bluebird "^3.5.2" - camel-case "^4.0.0" - cross-spawn "^7.0.0" - deepmerge "^4.2.2" - highlight.js "^10.0.0" - htmlparser2 "^4.0.0" - prismjs "^1.17.1" - strip-indent "^3.0.0" - striptags "^3.1.1" - -hexo-wordcount@^6.0.1: - version "6.0.1" - resolved "https://registry.npm.taobao.org/hexo-wordcount/download/hexo-wordcount-6.0.1.tgz#5a60efc9d3c8e421956f2fd6683ca94a8a795264" - integrity sha1-WmDvydPI5CGVby/WaDypSop5UmQ= - -hexo@^3.0.0, hexo@^3.7.0: - version "3.9.0" - resolved "https://registry.npm.taobao.org/hexo/download/hexo-3.9.0.tgz#7b5afe3b7de8829469635acc952757fac3ec863c" - integrity sha1-e1r+O33ogpRpY1rMlSdX+sPshjw= - dependencies: - abbrev "^1.1.1" - archy "^1.0.0" - bluebird "^3.5.2" - chalk "^2.4.1" - cheerio "0.22.0" - hexo-cli "^2.0.0" - hexo-front-matter "^0.2.3" - hexo-fs "^1.0.0" - hexo-i18n "^0.2.1" - hexo-log "^0.2.0" - hexo-util "^0.6.3" - js-yaml "^3.12.0" - lodash "^4.17.11" - minimatch "^3.0.4" - moment "^2.22.2" - moment-timezone "^0.5.21" - nunjucks "^3.1.3" - pretty-hrtime "^1.0.3" - resolve "^1.8.1" - strip-ansi "^5.0.0" - strip-indent "^2.0.0" - swig-extras "0.0.1" - swig-templates "^2.0.3" - text-table "^0.2.0" - tildify "^1.2.0" - titlecase "^1.1.2" - warehouse "^2.2.0" - -highlight.js@^10.0.0: - version "10.7.2" - resolved "https://registry.npm.taobao.org/highlight.js/download/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" - integrity sha1-iTGbhh7cZsSIVO0ebaIeqJ+Ec2A= - -highlight.js@^9.4.0: - version "9.18.5" - resolved "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825" - integrity sha1-0Yo1mGfzeME41oGe38KorNXymCU= - -hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.8.8.tgz?cache=0&sync_timestamp=1616602582092&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fhosted-git-info%2Fdownload%2Fhosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha1-dTm9S8Hg4KiVgVouAmJCCxKFhIg= - -html-entities@^1.2.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/html-entities/download/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha1-z70bAdKvr5rcobEK59/6uYxx0tw= - -htmlparser2@^3.9.1: - version "3.10.1" - resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha1-vWedw/WYl7ajS7EHSchVu1OpOS8= - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -htmlparser2@^4.0.0: - version "4.1.0" - resolved "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" - integrity sha1-mk7xYfLkYl6/ffvmwKL1LRilnng= - dependencies: - domelementtype "^2.0.1" - domhandler "^3.0.0" - domutils "^2.0.0" - entities "^2.0.0" - -http-errors@~1.7.2: - version "1.7.3" - resolved "https://registry.npm.taobao.org/http-errors/download/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -in-publish@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/in-publish/download/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c" - integrity sha1-lIsaU1yAMFYc6lIvc/ePS+NX4Aw= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npm.taobao.org/inherits/download/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= - -invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.npm.taobao.org/invariant/download/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk= - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz?cache=0&sync_timestamp=1604429547681&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-buffer%2Fdownload%2Fis-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha1-76ouqdqg16suoTqXsritUf776L4= - -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha1-lwN+89UiJNhRY/VZeytj2a/tmBo= - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-data-descriptor/download/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-descriptor/download/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-expression@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-expression/download/is-expression-1.0.2.tgz#a345b96218e9df21e65510c39b4dc3602fdd3f96" - integrity sha1-o0W5Yhjp3yHmVRDDm03DYC/dP5Y= - dependencies: - acorn "~2.7.0" - object-assign "^4.0.1" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/is-extendable/download/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/is-extglob/download/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/is-finite/download/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.npm.taobao.org/is-glob/download/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= - dependencies: - is-extglob "^2.1.1" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8= - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npm.taobao.org/is-number/download/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss= - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.0.0: - version "2.2.2" - resolved "https://registry.npm.taobao.org/is-promise/download/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" - integrity sha1-OauVnMv5p3TPB597QMeib3YxNfE= - -is-regex@^1.0.3: - version "1.1.2" - resolved "https://registry.npm.taobao.org/is-regex/download/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha1-gcjr3k2xQvLPHFP8htakV4gmYlE= - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.1" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/is-windows/download/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/is-wsl/download/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - -js-base64@^2.1.8: - version "2.6.4" - resolved "https://registry.npm.taobao.org/js-base64/download/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4" - integrity sha1-9OaGxd4eofhn28rT1G2WlCjfmMQ= - -js-stringify@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/js-stringify/download/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= - -js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/js-tokens/download/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -js-yaml@^3.12.0, js-yaml@^3.13.1, js-yaml@^3.6.1: - version "3.14.1" - resolved "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc= - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jstransformer@0.0.3: - version "0.0.3" - resolved "https://registry.npm.taobao.org/jstransformer/download/jstransformer-0.0.3.tgz#347495bd3fe1cfe8f03e2d71578acb9024826cf5" - integrity sha1-NHSVvT/hz+jwPi1xV4rLkCSCbPU= - dependencies: - is-promise "^2.0.0" - promise "^7.0.1" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npm.taobao.org/kind-of/download/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/locate-path/download/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4= - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.npm.taobao.org/lodash.assignin/download/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" - integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI= - -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.npm.taobao.org/lodash.bind/download/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= - -lodash.defaults@^4.0.1: - version "4.2.0" - resolved "https://registry.npm.taobao.org/lodash.defaults/download/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - -lodash.filter@^4.4.0: - version "4.6.0" - resolved "https://registry.npm.taobao.org/lodash.filter/download/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" - integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= - -lodash.flatten@^4.2.0: - version "4.4.0" - resolved "https://registry.npm.taobao.org/lodash.flatten/download/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - -lodash.foreach@^4.3.0: - version "4.5.0" - resolved "https://registry.npm.taobao.org/lodash.foreach/download/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= - -lodash.map@^4.4.0: - version "4.6.0" - resolved "https://registry.npm.taobao.org/lodash.map/download/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= - -lodash.merge@^4.4.0: - version "4.6.2" - resolved "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo= - -lodash.pick@^4.2.1: - version "4.4.0" - resolved "https://registry.npm.taobao.org/lodash.pick/download/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - -lodash.reduce@^4.4.0: - version "4.6.0" - resolved "https://registry.npm.taobao.org/lodash.reduce/download/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" - integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs= - -lodash.reject@^4.4.0: - version "4.6.0" - resolved "https://registry.npm.taobao.org/lodash.reject/download/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" - integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= - -lodash.some@^4.4.0: - version "4.6.0" - resolved "https://registry.npm.taobao.org/lodash.some/download/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" - integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= - -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.10: - version "4.17.21" - resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/loose-envify/download/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npm.taobao.org/lower-case/download/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha1-b6I3xj29xKgsoP2ILkci3F5jTig= - dependencies: - tslib "^2.0.3" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npm.taobao.org/map-cache/download/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/map-visit/download/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -markdown@~0.5.0: - version "0.5.0" - resolved "https://registry.npm.taobao.org/markdown/download/markdown-0.5.0.tgz#28205b565a8ae7592de207463d6637dc182722b2" - integrity sha1-KCBbVlqK51kt4gdGPWY33BgnIrI= - dependencies: - nopt "~2.1.1" - -marked@^0.3.9: - version "0.3.19" - resolved "https://registry.npm.taobao.org/marked/download/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" - integrity sha1-XUf3CcTJ/Dwha21GEnKA9As515A= - -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.npm.taobao.org/math-random/download/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw= - -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz?cache=0&sync_timestamp=1610076630150&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmeow%2Fdownload%2Fmeow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.npm.taobao.org/micromatch/download/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": - version "1.47.0" - resolved "https://registry.npm.taobao.org/mime-db/download/mime-db-1.47.0.tgz?cache=0&sync_timestamp=1617306310865&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-db%2Fdownload%2Fmime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha1-jLMT5Zll08Bc+/iYkVomevRqM1w= - -mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.30" - resolved "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.30.tgz?cache=0&sync_timestamp=1617340242028&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmime-types%2Fdownload%2Fmime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha1-bnvotMR5gl+F7WMmaV23P5MF1i0= - dependencies: - mime-db "1.47.0" - -mime@1.6.0, mime@^1.6.0: - version "1.6.0" - resolved "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/min-indent/download/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" - integrity sha1-pj9oFnOzBXH76LwlaGrnRu76mGk= - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: - version "3.0.4" - resolved "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npm.taobao.org/mixin-deep/download/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: - version "0.5.5" - resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= - dependencies: - minimist "^1.2.5" - -mkdirp@~1.0.4: - version "1.0.4" - resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha1-PrXtYmInVteaXw4qIh3+utdcL34= - -moment-timezone@^0.5.21: - version "0.5.33" - resolved "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.33.tgz?cache=0&sync_timestamp=1612595844884&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmoment-timezone%2Fdownload%2Fmoment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" - integrity sha1-slL9a7V/NBybWaWrYajlGnO70iw= - dependencies: - moment ">= 2.9.0" - -"moment@>= 2.9.0", moment@^2.10.6, moment@^2.18.0, moment@^2.22.2: - version "2.29.1" - resolved "https://registry.npm.taobao.org/moment/download/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" - integrity sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M= - -morgan@^1.9.0: - version "1.10.0" - resolved "https://registry.npm.taobao.org/morgan/download/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha1-CRd4q8H8R801CYJGU9rh+qtrF9c= - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1607433856838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz?cache=0&sync_timestamp=1607433856838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1607433856838&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk= - -mv@~2: - version "2.1.1" - resolved "https://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" - integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= - dependencies: - mkdirp "~0.5.1" - ncp "~2.0.0" - rimraf "~2.4.0" - -nan@^2.12.1, nan@^2.13.2: - version "2.14.2" - resolved "https://registry.npm.taobao.org/nan/download/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk= - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npm.taobao.org/nanomatch/download/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -ncp@~2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= - -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.npm.taobao.org/negotiator/download/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= - -nib@^1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/nib/download/nib-1.1.2.tgz#6a69ede4081b95c0def8be024a4c8ae0c2cbb6c7" - integrity sha1-amnt5AgblcDe+L4CSkyK4MLLtsc= - dependencies: - stylus "0.54.5" - -no-case@^2.2.0: - version "2.3.2" - resolved "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw= - dependencies: - lower-case "^1.1.1" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npm.taobao.org/no-case/download/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0= - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-fingerprint@0.0.2: - version "0.0.2" - resolved "https://registry.npm.taobao.org/node-fingerprint/download/node-fingerprint-0.0.2.tgz#31cbabeb71a67ae7dd5a7dc042e51c3c75868501" - integrity sha1-Mcur63GmeufdWn3AQuUcPHWGhQE= - -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.npm.taobao.org/node-gyp/download/node-gyp-3.8.0.tgz?cache=0&sync_timestamp=1617409989400&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-gyp%2Fdownload%2Fnode-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha1-VAMEJhwzDoDQ1e3OJTpoyzlkIYw= - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - -node-sass@^4.13.1, node-sass@^4.5.3: - version "4.14.1" - resolved "https://registry.npm.taobao.org/node-sass/download/node-sass-4.14.1.tgz?cache=0&sync_timestamp=1604150647469&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnode-sass%2Fdownload%2Fnode-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5" - integrity sha1-mch+wu+3BH7WOPtMnbfzpC4iF7U= - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash "^4.17.15" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.13.2" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "2.2.5" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -"nopt@2 || 3": - version "3.0.6" - resolved "https://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -nopt@~2.1.1: - version "2.1.2" - resolved "https://registry.npm.taobao.org/nopt/download/nopt-2.1.2.tgz#6cccd977b80132a07731d6e8ce58c2c8303cf9af" - integrity sha1-bMzZd7gBMqB3MdbozljCyDA8+a8= - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.5.0" - resolved "https://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.5.0.tgz?cache=0&sync_timestamp=1616087251352&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnormalize-package-data%2Fdownload%2Fnormalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/normalize-path/download/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= - -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0: - version "4.1.2" - resolved "https://registry.npm.taobao.org/npmlog/download/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha1-CKfyqL9zRgR3mp76StXMcXq7lUs= - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw= - dependencies: - boolbase "~1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nunjucks@^2.3.0: - version "2.5.2" - resolved "https://registry.npm.taobao.org/nunjucks/download/nunjucks-2.5.2.tgz#ea7d346e785b8a4874666c3cca9e18c577fba22c" - integrity sha1-6n00bnhbikh0Zmw8yp4YxXf7oiw= - dependencies: - asap "^2.0.3" - chokidar "^1.6.0" - yargs "^3.32.0" - -nunjucks@^3.0.0, nunjucks@^3.1.3: - version "3.2.3" - resolved "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.2.3.tgz#1b33615247290e94e28263b5d855ece765648a31" - integrity sha1-GzNhUkcpDpTigmO12FXs52VkijE= - dependencies: - a-sync-waterfall "^1.0.0" - asap "^2.0.3" - commander "^5.1.0" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= - -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/object-copy/download/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/object-visit/download/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npm.taobao.org/object.pick/download/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/on-headers/download/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -opn@^5.3.0: - version "5.5.0" - resolved "https://registry.npm.taobao.org/opn/download/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha1-/HFk+rVtI1kExRw7J9pnWMo7m/w= - dependencies: - is-wsl "^1.1.0" - -optimist@~0.6: - version "0.6.1" - resolved "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz?cache=0&sync_timestamp=1610108561355&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Foptimist%2Fdownload%2Foptimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@0: - version "0.1.5" - resolved "https://registry.npm.taobao.org/osenv/download/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha1-hc36+uso6Gd/QW4odZK18/SepBA= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-limit@^2.0.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/p-limit/download/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE= - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/p-locate/download/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ= - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/p-try/download/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha1-yyhoVA4xPWHeWPr741zpAE1VQOY= - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz?cache=0&sync_timestamp=1610966656461&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparse-json%2Fdownload%2Fparse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npm.taobao.org/parseurl/download/parseurl-1.3.3.tgz?cache=0&sync_timestamp=1598275525975&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fparseurl%2Fdownload%2Fparseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npm.taobao.org/pascal-case/download/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs= - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npm.taobao.org/pascalcase/download/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/path-dirname/download/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/path-key/download/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U= - -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz?cache=0&sync_timestamp=1615237868545&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-type%2Fdownload%2Fpath-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.npm.taobao.org/picomatch/download/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha1-IfMz6ba46v8CRo9RRupAbTRfTa0= - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz?cache=0&sync_timestamp=1599533339404&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpify%2Fdownload%2Fpify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npm.taobao.org/posix-character-classes/download/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - -pretty-hrtime@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= - -prismjs@^1.17.1: - version "1.23.0" - resolved "https://registry.npm.taobao.org/prismjs/download/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33" - integrity sha1-07OWf31yRAaQSXZSqdQP8EYGfzM= - optionalDependencies: - clipboard "^2.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= - -promise@^7.0.1: - version "7.3.1" - resolved "https://registry.npm.taobao.org/promise/download/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha1-BktyYCsY+Q8pGSuLG8QY/9Hr078= - dependencies: - asap "~2.0.3" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.28: - version "1.8.0" - resolved "https://registry.npm.taobao.org/psl/download/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= - -pug-attrs@^2.0.1: - version "2.0.4" - resolved "https://registry.npm.taobao.org/pug-attrs/download/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336" - integrity sha1-svRMQ55OtK1dTvJcrCDRitKMwzY= - dependencies: - constantinople "^3.0.1" - js-stringify "^1.0.1" - pug-runtime "^2.0.5" - -pug-code-gen@0.0.7: - version "0.0.7" - resolved "https://registry.npm.taobao.org/pug-code-gen/download/pug-code-gen-0.0.7.tgz#a5746759f57e099e4a17ef7d32798a0a0022107a" - integrity sha1-pXRnWfV+CZ5KF+99MnmKCgAiEHo= - dependencies: - constantinople "^3.0.1" - doctypes "^1.0.0" - js-stringify "^1.0.1" - pug-attrs "^2.0.1" - pug-error "^1.3.0" - pug-runtime "^2.0.0" - void-elements "^2.0.1" - with "^5.0.0" - -pug-error@^0.0.0: - version "0.0.0" - resolved "https://registry.npm.taobao.org/pug-error/download/pug-error-0.0.0.tgz#dd264a39c20d65487df85ff5663097862a16db78" - integrity sha1-3SZKOcINZUh9+F/1ZjCXhioW23g= - -pug-error@^1.3.0: - version "1.3.3" - resolved "https://registry.npm.taobao.org/pug-error/download/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6" - integrity sha1-80L7AIdS1YA0wYXeA2At2f/hX6Y= - -pug-filters@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/pug-filters/download/pug-filters-1.1.1.tgz#08bd3282ef7af8752ba73294ad74a5231edc1d12" - integrity sha1-CL0ygu96+HUrpzKUrXSlIx7cHRI= - dependencies: - clean-css "^3.3.0" - constantinople "^3.0.1" - jstransformer "0.0.3" - pug-error "^1.3.0" - pug-walk "^0.0.3" - resolve "^1.1.6" - uglify-js "^2.6.1" - -pug-lexer@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/pug-lexer/download/pug-lexer-1.0.0.tgz#0e7f125027b0bdffc01ebfe534ec4ec2c373c49e" - integrity sha1-Dn8SUCewvf/AHr/lNOxOwsNzxJ4= - dependencies: - character-parser "^2.1.1" - is-expression "^1.0.0" - pug-error "^1.3.0" - -pug-linker@0.0.4: - version "0.0.4" - resolved "https://registry.npm.taobao.org/pug-linker/download/pug-linker-0.0.4.tgz#eb9a785b2a9ae4a6e42eaf9fd637ccae6b7b3046" - integrity sha1-65p4Wyqa5KbkLq+f1jfMrmt7MEY= - dependencies: - pug-error "^1.3.0" - pug-walk "^0.0.3" - -pug-loader@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/pug-loader/download/pug-loader-1.0.0.tgz#02d16ffba820a4d0a5d7c2b038e875d367f1c5ad" - integrity sha1-AtFv+6ggpNCl18KwOOh102fxxa0= - dependencies: - pug-walk "0.0.3" - -pug-parser@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/pug-parser/download/pug-parser-1.0.0.tgz#09cf49bf3507f0243fe950cfeaae5c5edf66f425" - integrity sha1-Cc9JvzUH8CQ/6VDP6q5cXt9m9CU= - dependencies: - pug-error "^1.3.0" - token-stream "0.0.1" - -pug-runtime@2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/pug-runtime/download/pug-runtime-2.0.0.tgz#345d0929a11ec6f6057e91ba78e33913ae2a9a9c" - integrity sha1-NF0JKaEexvYFfpG6eOM5E64qmpw= - -pug-runtime@^2.0.0, pug-runtime@^2.0.5: - version "2.0.5" - resolved "https://registry.npm.taobao.org/pug-runtime/download/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a" - integrity sha1-baeXbDa/IvaOczw1kkDYrnoylTo= - -pug-strip-comments@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/pug-strip-comments/download/pug-strip-comments-0.0.1.tgz#ac346bb773d82492bf922dae2d4681a20cf0638f" - integrity sha1-rDRrt3PYJJK/ki2uLUaBogzwY48= - dependencies: - pug-error "^0.0.0" - -pug-walk@0.0.3, pug-walk@^0.0.3: - version "0.0.3" - resolved "https://registry.npm.taobao.org/pug-walk/download/pug-walk-0.0.3.tgz#c28be7bcc540f24b83d274472410827c84e31ac6" - integrity sha1-wovnvMVA8kuD0nRHJBCCfITjGsY= - -pug@2.0.0-alpha1: - version "2.0.0-alpha1" - resolved "https://registry.npm.taobao.org/pug/download/pug-2.0.0-alpha1.tgz#59270535b35e6568f137f4e120444dadd1485c7c" - integrity sha1-WScFNbNeZWjxN/ThIERNrdFIXHw= - dependencies: - pug-code-gen "0.0.7" - pug-filters "1.1.1" - pug-lexer "1.0.0" - pug-linker "0.0.4" - pug-loader "1.0.0" - pug-parser "1.0.0" - pug-runtime "2.0.0" - pug-strip-comments "0.0.1" - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz?cache=0&sync_timestamp=1616385328325&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fqs%2Fdownload%2Fqs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= - -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/randomatic/download/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha1-t3bvxZN1mE42xTey9RofCv8Noe0= - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npm.taobao.org/range-parser/download/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6: - version "2.3.7" - resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.7.tgz?cache=0&sync_timestamp=1599533166272&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.1.1: - version "3.6.0" - resolved "https://registry.npm.taobao.org/readable-stream/download/readable-stream-3.6.0.tgz?cache=0&sync_timestamp=1599533166272&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freadable-stream%2Fdownload%2Freadable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha1-M3u9o63AcGvT4CRCaihtS0sskZg= - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@^2.0.0, readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-2.2.1.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.npm.taobao.org/readdirp/download/readdirp-3.5.0.tgz?cache=0&sync_timestamp=1615717369278&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Freaddirp%2Fdownload%2Freaddirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha1-m6dMAZsV02UnjS6Ru4xI17TULJ4= - dependencies: - picomatch "^2.2.1" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.npm.taobao.org/regenerator-runtime/download/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk= - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha1-db3FiioUls7EihKDW8VMjVYjNt0= - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npm.taobao.org/regex-not/download/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha1-eC4NglwMWjuzlzH4Tv7mt0Lmsc4= - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz?cache=0&sync_timestamp=1598277408084&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frepeating%2Fdownload%2Frepeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request@^2.87.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.npm.taobao.org/request/download/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM= - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/require-main-filename/download/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npm.taobao.org/resolve-url/download/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.8.1: - version "1.20.0" - resolved "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npm.taobao.org/ret/download/ret-0.1.15.tgz?cache=0&sync_timestamp=1613003344827&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fret%2Fdownload%2Fret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" - -rimraf@2: - version "2.7.1" - resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.7.1.tgz?cache=0&sync_timestamp=1598275565847&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= - dependencies: - glob "^7.1.3" - -rimraf@~2.4.0: - version "2.4.5" - resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-2.4.5.tgz?cache=0&sync_timestamp=1598275565847&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Frimraf%2Fdownload%2Frimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" - integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= - dependencies: - glob "^6.0.1" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz?cache=0&sync_timestamp=1598277415399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= - -safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.1.tgz?cache=0&sync_timestamp=1598277415399&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsafe-buffer%2Fdownload%2Fsafe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= - -safe-json-stringify@~1: - version "1.2.0" - resolved "https://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" - integrity sha1-NW5EvJjx+TzkXfFLzXwBzahuCv0= - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npm.taobao.org/safe-regex/download/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= - -sass-graph@2.2.5: - version "2.2.5" - resolved "https://registry.npm.taobao.org/sass-graph/download/sass-graph-2.2.5.tgz#a981c87446b8319d96dce0671e487879bd24c2e8" - integrity sha1-qYHIdEa4MZ2W3OBnHkh4eb0kwug= - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^13.3.2" - -sax@0.5.x: - version "0.5.8" - resolved "https://registry.npm.taobao.org/sax/download/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" - integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= - -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha1-KBYjTiN4vdxOU1T6tcqold9xANk= - -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - -select@^1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/select/download/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" - integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= - -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0= - -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.npm.taobao.org/semver/download/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - -send@0.17.1: - version "0.17.1" - resolved "https://registry.npm.taobao.org/send/download/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - -serve-static@^1.13.2: - version "1.14.1" - resolved "https://registry.npm.taobao.org/serve-static/download/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/set-value/download/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo= - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/shebang-regex/download/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI= - -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npm.taobao.org/snapdragon-node/download/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/snapdragon-util/download/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npm.taobao.org/snapdragon/download/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: - version "0.5.3" - resolved "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.npm.taobao.org/source-map-url/download/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= - -source-map@0.1.34: - version "0.1.34" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.1.34.tgz?cache=0&sync_timestamp=1598275560784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.1.34.tgz#a7cfe89aec7b1682c3b198d0acfb47d7d090566b" - integrity sha1-p8/omux7FoLDsZjQrPtH19CQVms= - dependencies: - amdefine ">=0.0.4" - -source-map@0.1.x: - version "0.1.43" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz?cache=0&sync_timestamp=1598275560784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= - dependencies: - amdefine ">=0.0.4" - -source-map@0.4.x, source-map@^0.4.2: - version "0.4.4" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz?cache=0&sync_timestamp=1598275560784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - -source-map@^0.5.6, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1598275560784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1598275560784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.npm.taobao.org/source-map/download/source-map-0.7.3.tgz?cache=0&sync_timestamp=1598275560784&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map%2Fdownload%2Fsource-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha1-UwL4FpAxc1ImVECS5kmB91F1A4M= - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.1.1.tgz?cache=0&sync_timestamp=1599533144991&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-correct%2Fdownload%2Fspdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz?cache=0&sync_timestamp=1599533145483&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fspdx-expression-parse%2Fdownload%2Fspdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha1-6cGKQQ5e1+EkQqVJ+9ivp2cDjWU= - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npm.taobao.org/split-string/download/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@^1.0.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" - integrity sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM= - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npm.taobao.org/static-extend/download/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.npm.taobao.org/statuses/download/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.npm.taobao.org/stdout-stream/download/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha1-WsF0zdXNcmEEqgwLK9g4FdjVNd4= - dependencies: - readable-stream "^2.0.1" - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.npm.taobao.org/string-width/download/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.npm.taobao.org/string-width/download/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha1-InZ74htirxCBV0MG9prFG2IgOWE= - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4= - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4= - dependencies: - ansi-regex "^4.1.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz?cache=0&sync_timestamp=1598277403718&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fstrip-bom%2Fdownload%2Fstrip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npm.taobao.org/strip-indent/download/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha1-wy4c7pQLazQyx3G8LFS8znPNMAE= - dependencies: - min-indent "^1.0.0" - -striptags@^2.1.1: - version "2.2.1" - resolved "https://registry.npm.taobao.org/striptags/download/striptags-2.2.1.tgz#4c450b708d41b8bf39cf24c49ff234fc6aabfd32" - integrity sha1-TEULcI1BuL85zyTEn/I0/Gqr/TI= - -striptags@^3.1.1: - version "3.1.1" - resolved "https://registry.npm.taobao.org/striptags/download/striptags-3.1.1.tgz#c8c3e7fdd6fb4bb3a32a3b752e5b5e3e38093ebd" - integrity sha1-yMPn/db7S7OjKjt1LltePjgJPr0= - -stylus@0.54.5: - version "0.54.5" - resolved "https://registry.npm.taobao.org/stylus/download/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" - integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk= - dependencies: - css-parse "1.7.x" - debug "*" - glob "7.0.x" - mkdirp "0.5.x" - sax "0.5.x" - source-map "0.1.x" - -stylus@^0.54.5: - version "0.54.8" - resolved "https://registry.npm.taobao.org/stylus/download/stylus-0.54.8.tgz#3da3e65966bc567a7b044bfe0eece653e099d147" - integrity sha1-PaPmWWa8Vnp7BEv+DuzmU+CZ0Uc= - dependencies: - css-parse "~2.0.0" - debug "~3.1.0" - glob "^7.1.6" - mkdirp "~1.0.4" - safer-buffer "^2.1.2" - sax "~1.2.4" - semver "^6.3.0" - source-map "^0.7.3" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz?cache=0&sync_timestamp=1611394404603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1611394404603&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= - dependencies: - has-flag "^3.0.0" - -swig-extras@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/swig-extras/download/swig-extras-0.0.1.tgz#b503fede372ab9c24c6ac68caf656bcef1872328" - integrity sha1-tQP+3jcqucJMasaMr2VrzvGHIyg= - dependencies: - markdown "~0.5.0" - -swig-templates@^2.0.3: - version "2.0.3" - resolved "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.3.tgz#6b4c43b462175df2a8da857a2043379ec6ea6fd0" - integrity sha1-a0xDtGIXXfKo2oV6IEM3nsbqb9A= - dependencies: - optimist "~0.6" - uglify-js "2.6.0" - -swig@^1.4.2: - version "1.4.2" - resolved "https://registry.npm.taobao.org/swig/download/swig-1.4.2.tgz#4085ca0453369104b5d483e2841b39b7ae1aaba5" - integrity sha1-QIXKBFM2kQS11IPihBs5t64aq6U= - dependencies: - optimist "~0.6" - uglify-js "~2.4" - -tar@^2.0.0: - version "2.2.2" - resolved "https://registry.npm.taobao.org/tar/download/tar-2.2.2.tgz?cache=0&sync_timestamp=1611275729265&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftar%2Fdownload%2Ftar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40" - integrity sha1-DKiEhWLHKZuLRG/2pNYM27I+3EA= - dependencies: - block-stream "*" - fstream "^1.0.12" - inherits "2" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -"through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -tildify@^1.2.0: - version "1.2.0" - resolved "https://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= - dependencies: - os-homedir "^1.0.0" - -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/tiny-emitter/download/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" - integrity sha1-HRpW7fxRxD6GPLtTgqcjMONVVCM= - -titlecase@^1.1.2: - version "1.1.3" - resolved "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.3.tgz#fc6d65ff582b0602410768ef1a09b70506313dc3" - integrity sha1-/G1l/1grBgJBB2jvGgm3BQYxPcM= - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npm.taobao.org/to-object-path/download/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npm.taobao.org/to-regex-range/download/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ= - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npm.taobao.org/to-regex/download/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/toidentifier/download/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= - -token-stream@0.0.1: - version "0.0.1" - resolved "https://registry.npm.taobao.org/token-stream/download/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" - integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= - -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.npm.taobao.org/true-case-path/download/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha1-+BO1qMhrQNpZYGcisUTjIleZ9H0= - dependencies: - glob "^7.1.2" - -tslib@^2.0.3: - version "2.2.0" - resolved "https://registry.npm.taobao.org/tslib/download/tslib-2.2.0.tgz?cache=0&sync_timestamp=1617648005378&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" - integrity sha1-+yxHWXfjXiQTEe3iaTzuHsZpj1w= - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - -uglify-js@2.6.0: - version "2.6.0" - resolved "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz?cache=0&sync_timestamp=1616975948289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.6.0.tgz#25eaa1cc3550e39410ceefafd1cfbb6b6d15f001" - integrity sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE= - dependencies: - async "~0.2.6" - source-map "~0.5.1" - uglify-to-browserify "~1.0.0" - yargs "~3.10.0" - -uglify-js@^2.6.1: - version "2.8.29" - resolved "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz?cache=0&sync_timestamp=1616975948289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-js@~2.4: - version "2.4.24" - resolved "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.4.24.tgz?cache=0&sync_timestamp=1616975948289&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fuglify-js%2Fdownload%2Fuglify-js-2.4.24.tgz#fad5755c1e1577658bb06ff9ab6e548c95bebd6e" - integrity sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4= - dependencies: - async "~0.2.6" - source-map "0.1.34" - uglify-to-browserify "~1.0.0" - yargs "~3.5.4" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/union-value/download/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npm.taobao.org/unset-value/download/unset-value-1.0.0.tgz?cache=0&sync_timestamp=1616088624525&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Funset-value%2Fdownload%2Funset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.npm.taobao.org/upath/download/upath-1.2.0.tgz?cache=0&sync_timestamp=1613003353873&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fupath%2Fdownload%2Fupath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= - -upper-case@^1.1.1: - version "1.1.3" - resolved "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg= - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npm.taobao.org/uri-js/download/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/urix/download/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npm.taobao.org/use/download/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -utils-merge@1.0.1, utils-merge@^1.0.0: - version "1.0.1" - resolved "https://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.npm.taobao.org/uuid/download/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -void-elements@^2.0.1: - version "2.0.1" - resolved "https://registry.npm.taobao.org/void-elements/download/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= - -warehouse@^2.2.0: - version "2.2.0" - resolved "https://registry.npm.taobao.org/warehouse/download/warehouse-2.2.0.tgz#5d09d64942992be667d8f7c86a09c2b8aea04062" - integrity sha1-XQnWSUKZK+Zn2PfIagnCuK6gQGI= - dependencies: - JSONStream "^1.0.7" - bluebird "^3.2.2" - cuid "~1.3.8" - graceful-fs "^4.1.3" - is-plain-object "^2.0.1" - lodash "^4.2.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1, which@^1.2.9: - version "1.3.1" - resolved "https://registry.npm.taobao.org/which/download/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npm.taobao.org/which/download/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE= - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.npm.taobao.org/wide-align/download/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha1-rgdOa9wMFKQx6ATmJFScYzsABFc= - dependencies: - string-width "^1.0.2 || 2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.npm.taobao.org/window-size/download/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= - -with@^5.0.0: - version "5.1.1" - resolved "https://registry.npm.taobao.org/with/download/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" - integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= - dependencies: - acorn "^3.1.0" - acorn-globals "^3.0.0" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha1-H9H2cjXVttD+54EFYAG/tpTAOwk= - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^3.2.0: - version "3.2.2" - resolved "https://registry.npm.taobao.org/y18n/download/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha1-hckBvWRwznH8S7cjrSCbcPfyhpY= - -y18n@^4.0.0: - version "4.0.2" - resolved "https://registry.npm.taobao.org/y18n/download/y18n-4.0.2.tgz#c504495ba9b59230dd60226d1dd89c3c0a1b745e" - integrity sha1-xQRJW6m1kjDdYCJtHdicPAobdF4= - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.npm.taobao.org/yargs-parser/download/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha1-Ew8JcC667vJlDVTObj5XBvek+zg= - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.npm.taobao.org/yargs/download/yargs-13.3.2.tgz?cache=0&sync_timestamp=1617506423583&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha1-rX/+/sGqWVZayRX4Lcyzipwxot0= - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@^3.32.0: - version "3.32.0" - resolved "https://registry.npm.taobao.org/yargs/download/yargs-3.32.0.tgz?cache=0&sync_timestamp=1617506423583&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - integrity sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU= - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz?cache=0&sync_timestamp=1617506423583&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yargs@~3.5.4: - version "3.5.4" - resolved "https://registry.npm.taobao.org/yargs/download/yargs-3.5.4.tgz?cache=0&sync_timestamp=1617506423583&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fyargs%2Fdownload%2Fyargs-3.5.4.tgz#d8aff8f665e94c34bd259bdebd1bfaf0ddd35361" - integrity sha1-2K/49mXpTDS9JZvevRv68N3TU2E= - dependencies: - camelcase "^1.0.2" - decamelize "^1.0.0" - window-size "0.1.0" - wordwrap "0.0.2"