<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 準備 > [getting-started.md](https://github.com/rust-lang/rust/blob/master/src/doc/book/getting-started.md) commit 52786de3ed2ff4553378c9b9bca1a60d8b2a2e9d 本書的第一部分將帶領大家了解 Rust 及其工具。在安裝 Rust 之后,我們將開始編寫經典的“Hello World”程序。最后將介紹 Cargo,Rust 的構建系統以及包管理器。 ### 安裝 Rust 開始使用 Rust 的第一步是安裝它。總的來說,你需要聯網執行本部分的命令,因為我們將會從網上下載 Rust。 我們將會展示很多使用終端的命令,并且這些行都以`$`開頭。并不需要真正輸入`$`,在這里它們代表每行指令的開頭。你會在網上看到很多使用這個慣例的教程和例子:`$`代表常規用戶運行的命令,`#`代表需要管理員用戶運行的命令。 ### 平臺支持 Rust 編譯器編譯并運行于很多平臺之上,但不是所有的平臺都被平等的支持。Rust 的平臺支持水平可以被劃分為三個等級,每一級都有不同的保證程度。 每個平臺都由他們的 "target triple" 標識,它是一個代表編譯器會產生何種輸出的字符串。下面的列代表特定平臺是否支持相應的組件。 ### T1 科技(Tier 1) 等級一平臺可以被認為是“確保可以構建和工作的”。具體的他們將滿足如下要求: - 為此平臺建立了自動化測試 - 向`rust-lang/rust`倉庫的 master 分支提交的修改確保測試通過 - 發布官方安裝程序 - 提供該平臺下如何使用和構建的文檔。 | Target | std | rustc | cargo | notes | |-----|-----|-----|-----|-----| | `x86_64-pc-windows-msvc` | ? | ? | ? | 64-bit MSVC (Windows 7+) | | `i686-pc-windows-gnu` | ? | ? | ? | 32-bit MinGW (Windows 7+) | | `x86_64-pc-windows-gnu` | ? | ? | ? | 64-bit MinGW (Windows 7+) | | `i686-apple-darwin` | ? | ? | ? | 32-bit OSX (10.7+, Lion+) | | `x86_64-apple-darwin` | ? | ? | ? | 64-bit OSX (10.7+, Lion+) | | `i686-unknown-linux-gnu` | ? | ? | ? | 32-bit Linux (2.6.18+) | | `x86_64-unknown-linux-gnu` | ? | ? | ? | 64-bit Linux (2.6.18+) | ### T2 科技(Tier 2) 等級二平臺可以被認為是“保證能夠構建的”。因為沒有(保證)運行自動測試所以并不保證能產生可工作的構建,不過這些平臺通常工作良好同時補丁是永遠受歡迎的!具體的這些平臺被要求將滿足如下: - 設置了自動化測試,不過可能并沒有運行 - 向`rust-lang/rust`倉庫的 master 分支提交的修改確保該平臺**將被構建**。注意這意味著一些平臺只編譯了標準庫,而有些將會運行整個 bootstrap。 - 發布官方安裝程序 | Target | std | rustc | cargo | notes | |-----|-----|-----|-----|-----| | `i686-pc-windows-msvc` | ? | ? | ? | 32-bit MSVC (Windows 7+) | | `x86_64-unknown-linux-musl` | ? | | | 64-bit Linux with MUSL | | `arm-linux-androideabi` | ? | | | ARM Android | | `arm-unknown-linux-gnueabi` | ? | ? | | ARM Linux (2.6.18+) | | `arm-unknown-linux-gnueabihf` | ? | ? | | ARM Linux (2.6.18+) | | `aarch64-unknown-linux-gnu` | ? | | | ARM64 Linux (2.6.18+) | | `mips-unknown-linux-gnu` | ? | | | MIPS Linux (2.6.18+) | | `mipsel-unknown-linux-gnu` | ? | | | MIPS (LE) Linux (2.6.18+) | ### T3 科技(Tier 3)(Tengu!!!) 等級三平臺代表 Rust 有提供支持,不過提交的修改并不保證能構建或通過測試。可運行的構建也可能是有 bug 的,因為它的可靠性通常由社區貢獻來確定。另外并不提供官方發布文檔和安裝程序,不過在一些非官方地址可能會提供社區版本。 | Target | std | rustc | cargo | notes | |-----|-----|-----|-----|-----| | `i686-linux-android` | ? | | | 32-bit x86 Android | | `aarch64-linux-android` | ? | | | ARM64 Android | | `powerpc-unknown-linux-gnu` | ? | | | PowerPC Linux (2.6.18+) | | `i386-apple-ios` | ? | | | 32-bit x86 iOS | | `x86_64-apple-ios` | ? | | | 64-bit x86 iOS | | `armv7-apple-ios` | ? | | | ARM iOS | | `armv7s-apple-ios` | ? | | | ARM iOS | | `aarch64-apple-ios` | ? | | | ARM64 iOS | | `i686-unknown-freebsd` | ? | ? | | 32-bit FreeBSD | | `x86_64-unknown-freebsd` | ? | ? | | 64-bit FreeBSD | | `x86_64-unknown-openbsd` | ? | ? | | 64-bit OpenBSD | | `x86_64-unknown-netbsd` | ? | ? | | 64-bit NetBSD | | `x86_64-unknown-bitrig` | ? | ? | | 64-bit Bitrig | | `x86_64-unknown-dragonfly` | ? | ? | | 64-bit DragonFlyBSD | | `x86_64-rumprun-netbsd` | ? | | | 64-bit NetBSD Rump Kernel | | `i686-pc-windows-msvc` (XP) | ? | | | Windows XP support | | `x86_64-pc-windows-msvc` (XP) | ? | | | Windows XP support | 注意這個表格可能會隨著時間而擴展,這將永遠不會是等級三平臺的完整列表! ### 在 Linux 和 Mac 上安裝 如果使用 Linux 或 Mac,所有我們需要做的就是打開一個終端并輸入如下: ~~~ $ curl -sSf https://static.rust-lang.org/rustup.sh | sh ~~~ 這將會下載一個腳本,并開始安裝。如果一切順利,你將會看到這些: ~~~ Welcome to Rust. This script will download the Rust compiler and its package manager, Cargo, and install them to /usr/local. You may install elsewhere by running this script with the --prefix=<path> option. The installer will run under ‘sudo’ and may ask you for your password. If you do not want the script to run ‘sudo’ then pass it the --disable-sudo flag. You may uninstall later by running /usr/local/lib/rustlib/uninstall.sh, or by running this script again with the --uninstall flag. Continue? (y/N) ~~~ 在這里輸入,輸入`y`來選擇`yes`,并按照接下來的提示操作。 ### 在 Windows 上安裝 如果你使用 Windows,請下載合適的[安裝包](https://www.rust-lang.org/install.html) ### 卸載 卸載 Rust 跟安裝它一樣容易。在 Linux 或 Mac 上,運行卸載腳本: ~~~ $ sudo /usr/local/lib/rustlib/uninstall.sh ~~~ 如果你使用的是 Windows 安裝包,再次運行`.msi`文件,它會給我們一個卸載選項。 ### 疑難解答(Troubleshooting) 安裝了 Rust 后,我們可以打開一個 shell,并輸入: ~~~ $ rustc --version ~~~ 你應該看到版本號,提交的 hash 值和提交時間。 如果你做到了,那么 Rust 已成功安裝!恭喜你!(此處應有掌聲) 如果這不能工作并且你在使用 Windows,檢查 Rust 是否在你的`%PATH%`系統變量中。如果不是,再次運行安裝程序,在“Change, repair, or remove installation”頁面選擇“Change”并確保“Add to PATH”指向本地硬盤。 如果還是搞不定,有幾個你可以獲取幫助的地方。最簡單的是通過[Mibbit](http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust)訪問位于 irc.mozilla.org 的 #rust IRC頻道 。點擊上面的鏈接,你就可以與其它Rustaceans(簡單理解為Ruster吧)聊天,我們會幫助你。其它給力的資源包括[用戶論壇](https://users.rust-lang.org/)和[Stack Overflow](http://stackoverflow.com/questions/tagged/rust)。 安裝程序(腳本)也會在本地安裝一份文檔拷貝,所以你可以離線閱讀它們。在 UNIX 系統上,位置是`/usr/local/share/doc/rust`。在Windows,它位于你 Rust 安裝位置的`share/doc`文件夾。 ### Hello, world! 現在你已經安裝好了 Rust,我們將幫助你編寫你的第一個 Rust 程序。當學習一門新語言的時候編寫一個在屏幕上打印 “Hello, world!” 文本的小程序是一個傳統,而在這一部分,我們將遵循這個傳統。 以這樣一個簡單的程序開始的好處是你可以快速的確認你的編譯器已正確安裝,并可以正常工作。在屏幕上打印信息也是一個非常常見的操作,所以早點實踐一下是有好處的。 > 注意:本書假設你熟悉基本的命令行操作。Rust 本身并不對你的編輯器,工具和你的代碼存放在何處有什么特定的要求,所以如果你比起命令行更喜歡 IDE,這里也有一個選擇。你可能想要試試[SolidOak](https://github.com/oakes/SolidOak),它轉為 Rust 而設計。在 Rust 社區里有許許多多正在開發中的 IDE 插件。Rust 團隊也發布了[不同編輯器的插件](https://github.com/rust-lang/rust/blob/master/src/etc/CONFIGS.md)。 配置編輯器或 IDE 已超出本教程的范疇,所以請查看你特定設置的文檔。 ### 創建一個項目文件 首先,創建一個文件來編寫 Rust 代碼。Rust 并不關心你的代碼存放在哪里,不過在本書中,我們建議在你的 home 目錄創建一個存放項目的目錄,并把你的所有項目放在這。打開一個終端并輸入如下命令來為這個項目創建一個文件夾: ~~~ $ mkdir ~/projects $ cd ~/projects $ mkdir hello_world $ cd hello_world ~~~ > 如果你使用 Windows 并且沒有用 PowerShell,`~`可能不指向你的用戶目錄。可以查詢所使用的 Shell 的相關文檔以獲取更多信息。 ### 編寫并運行一個 Rust 程序 接下來,創建一個叫做`main.rs`的源文件。Rust 代碼文件總是使用 `.rs` 后綴,并且如果我們用的 Rust 文件名由多個單詞組成,我們使用下劃線分隔它們;例如,使用`hello_world.rs`而不是`helloworld.rs` 現在打開你剛創建的`main.rs`源文件,鍵入如下代碼: +[code](https://play.rust-lang.org/?code=fn%20main()%20%7B%0A%20%20%20%20println!(%22Hello%2C%20world!%22)%3B%0A%7D%0A) ~~~ fn main() { println!("Hello, world!"); } ~~~ 保存文件,并回到你的命令行窗口。在 Linux 或 OSX 上,輸入如下命令: ~~~ $ rustc main.rs $ ./main Hello, world! ~~~ 在 Windows 下,使用`main.exe`而不是`main`。不管你使用何種系統,你應該在終端看到`Hello, world!`字符串。如果你做到了,那么恭喜你!你已經正式編寫了一個 Rust 程序。這使你成為了一名 Rust 程序猿!歡迎入坑! ### 分析一個 Rust 程序 現在,讓我們回過頭來仔細看看你的“Hello, world!”程序到底發生了什么。這里是拼圖的第一片: +[code](https://play.rust-lang.org/?code=fn%20main()%20%7B%0A%0A%7D%0A) ~~~ fn main() { } ~~~ 這幾行定義了一個 Rust *函數*。`main` 函數是特殊的:這是所有 Rust 程序的開始。第一行表示“定義一個叫 `main` 的函數,沒有參數也沒有返回值。”如果有參數的話,它們應該出現在括號(`(`和`)`)中。因為并沒有返回值,所以我們可以省略整個返回值類型。 同時注意函數體被包裹在大括號(`{`和`}`)中。Rust 要求所有函數體都位于其中。將前一個大括號與函數聲明置于一行,并留有一個空格被認為是一個好的代碼風格。 在`main()`函數中: +[code](https://play.rust-lang.org/?code=fn%20main()%20%7B%0A%20%20%20%20%20%20%20%20println!(%22Hello%2C%20world!%22)%3B%0A%20%20%20%20%0A%7D) ~~~ println!("Hello, world!"); ~~~ 這行代碼做了這個小程序的所有工作:它在屏幕上打印文本。這有很多重要的細節。第一個是使用 4 個空格縮進,而不是制表符。 第二個重要的部分是`println!()`這一行。這是一個 Rust [宏](#),是 Rust 元編程的關鍵所在。相反如果我們調用一個函數的話,它應該看起來像這樣:`println()`(木有 !)。我們將在后面更加詳細的討論 Rust 宏,不過現在你只需記住當看到符號 `!` 的時候,就代表調用了一個宏而不是一個普通的函數。 接下來,`"Hello, world!"` 是一個字符串。在一門系統級編程語言中,字符串是一個復雜得令人驚訝的話題。這是一個[靜態分配](#)的字符串。這個語句將這個字符串作為參數傳遞給`println!` 宏,這個宏負責在屏幕(控制臺)上打印字符串。是不是很簡單啊(⊙o⊙) 這一行以一個分號結尾(`;`)。Rust是一門[**面向表達式**](#)的語言,也就是說大部分語句都是表達式。`;` 表示一個表達式的結束,另一個新表達式的開始。大部分 Rust 代碼行以`;`結尾。 ### 編譯和運行是兩個步驟 在“編寫并運行一個 Rust 程序”,我們展示了如何運行一個新創建的程序。現在我們將拆分并檢查每一個操作。 在運行一個 Rust 程序之前,你必須編譯它。你可以輸入`rustc`命令來使用 Rust 編譯器并像這樣傳遞你源文件的名字: ~~~ $ rustc main.rs ~~~ 如果你來自 C 或 C++ 背景,你會發現這與`gcc`和`clang`類似。編譯成功后,Rust 應該會輸出一個二進制可執行文件,在 Linux 或 OSX 下在shell 中通過如下`ls`命令你可以看到它: ~~~ $ ls main main.rs ~~~ 在 Windows 下,輸入: ~~~ $ dir main.exe main.rs ~~~ 這表示我們有兩個文件:`.rs`后綴的源文件,和可執行文件(在 Windows下是`main.exe`,其它平臺是`main`)。這里我們剩下的操作就只有運行`main`或`main.exe`文件了,像這樣: ~~~ $ ./main # or main.exe on Windows ~~~ 如果`main.rs`是我們的“Hello, world!”程序,它將會在你的終端上打印`Hello, world!`。 來自 Ruby、Python 或 JavaScript 這樣的動態類型語言背景的同學,可能不太習慣這樣將編譯和執行分開。Rust 是一種 **預編譯語言**(*ahead-of-time compiled language*),程序編譯好后,把它給任何人,他們都不需要安裝 Rust 就可運行。如果你給他們一個 `.rb` , `.py` 或 `.js` 文件,他們需要先分別安裝 Ruby,Python,JavaScript 實現,不過你只需要一句命令就可以編譯和執行你的程序。這一切都是語言設計的權衡取舍。 僅僅使用`rustc`編譯簡單程序是沒問題的,不過隨著你的項目的增長,你將想要能夠控制你項目擁有的所有選項,并易于分享你的代碼給別人或別的項目。接下來,我們將介紹一個叫做 Cargo 的工具,它將幫助你編寫現實生活中的 Rust 程序。 ### Hello, Cargo! Cargo 是 Rust 的構建系統和包管理工具,同時 Rustacean 們使用 Cargo 來管理它們的 Rust 項目。Cargo 負責三個工作:構建你的代碼,下載你代碼依賴的庫并編譯這些庫。我們把你代碼需要的庫叫做“依賴(dependencies)”因為你的代碼依賴他們。 最簡單的 Rust 程序并沒有任何依賴,所以目前我們只使用它的第一部分功能。隨著你編寫更加復雜的 Rust 程序,你會想要添加依賴,那么如果你使用 Cargo 開始的話,這將會變得簡單許多。 因為絕大部分 Rust 項目使用 Cargo,本書接下來的部分將假設你使用它。如果你使用官方安裝包的話,Rust 自帶 Cargo。如果你使用其他方式安裝 Rust 的話,你可以在終端輸入如下命令檢查你是否安裝了 Cargo: ~~~ $ cargo --version ~~~ 如果你看到了版本號,一切 OK!如果你一個類似“`command not found`”的錯誤,那么你應該去查看你安裝 Rust 的系統的相關文檔,來確定 Cargo 是否需要單獨安裝。 ### 轉換到 Cargo 讓我們將 Hello World 程序遷移至 Cargo。為了 Cargo 化一個項目,需要做三件事: 1. 將源文件放到正確的目錄 1. 刪除舊的可執行文件(Windows下是`main.exe`,其他平臺是`main`)并生成一個新的。 1. 創建一個 Cargo 配置文件 讓我們開始吧! ### 創建一個新的可執行文件和源文件目錄 首先,回到你的終端,移動到你的`hello_world`目錄,并輸入如下命令: ~~~ $ mkdir src $ mv main.rs src/main.rs $ rm main # or 'del main.exe' on Windows ~~~ Cargo 期望源文件位于 src 目錄,所以先做這個。這樣將項目頂級目錄(在這里,是 hello_world)留給 README,license 信息和其他跟代碼無關的文件。這樣,Cargo 幫助你保持項目干凈整潔。一切井井有條。 現在,復制`main.rs`到`src`目錄,并刪除你用`rustc`創建的編譯過的文件。一如既往,如果你使用 Windows 用`main.exe`代替`main`。 例子中我們繼續使用`main.rs`作為源文件名是因為它創建了一個可執行文件。如果你想要創建一個庫文件,使用`lib.rs`作為文件名。Cargo 使用這個約定來正確編譯你的項目,不過如果你想的話你也可以覆蓋它。 ### 創建一個配置文件 下一步,在`hello_world`目錄創建一個文件,叫做`Cargo.toml`。 確保`Cargo.toml`的`C`是大寫的,否則 Cargo 不知道如何處理配置文件。 這個文件使用[TOML](https://github.com/toml-lang/toml)(Tom's Obvious, Minimal Language)格式。 TOML 類似于 INI,不過有一些額外的改進之處,并且被用作 Cargo 的配置文件。 在這個文件中,輸入如下信息: ~~~ [package] name = "hello_world" version = "0.0.1" authors = [ "Your name <you@example.com>" ] ~~~ 第一行,`[package]`,表明下面的語句用來配置一個包。隨著我們在這個文件增加更多的信息,我們會增加其他部分,不過現在,我們只有包配置。 另外三行設置了 Cargo 編譯你的程序所需要知道的三個配置:包的名字,版本,和作者。 當你在`Cargo.toml`中添加完這些信息后,保存它來完成配置文件的創建。 ### 構建并運行一個 Cargo 項目 當`Cargo.toml`文件位于項目的根目錄時,我們就準備好可以構建并運行 Hello World 程序了!為此,我們輸入如下命令: ~~~ $ cargo build Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world) $ ./target/debug/hello_world Hello, world! ~~~ 如果一切順利,你應該再次看到`Hello, world!`出現在終端里。 你剛剛用`cargo build`構建了一個程序并用`./target/debug/hello_world`運行了它,不過你也可以用如下的一步操作`cargo run`來完成這兩步操作: ~~~ $ cargo run Running `target/debug/hello_world` Hello, world! ~~~ 注意這個例子并沒有重新構建項目。Cargo 發現文件并沒有被修改,所以它只是運行了二進制文件。如果你修改了源文件,Cargo 會在運行前重新構建項目,這樣你將看到像這樣的輸出: ~~~ $ cargo run Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world) Running `target/debug/hello_world` Hello, world! ~~~ Cargo 檢查任何項目文件是否被修改,并且只會在你上次構建后修改了他們才重新構建。 對于簡單的項目,Cargo 并不比使用`rustc`要好多少,不過將來它會變得有用。這在你開始使用 crate 時顯得尤為正確;(crate)在其他語言中有“庫(library)”或“包(package)”這樣的同義詞。對于包含多個 crate 的項目,讓 Cargo 來協調構建將會輕松很多。有了 Cargo,你可以運行`cargo build`,而一切將有條不紊的運行。 ### 發布構建(Building for Release) 當你的項目最終準備好發布了,可以使用`cargo build --release`來優化編譯項目。這些優化可以讓 Rust 代碼運行的更快,不過啟用他們會讓程序花更長的時間編譯。這也是為何這是兩種不同的配置,一個為了開發,另一個構建提供給用戶的最終程序。 運行這個命令同時也會讓 Cargo 創建一個叫做`Cargo.lock`的文件,它看起來像這樣: ~~~ [root] name = "hello_world" version = "0.0.1" ~~~ Cargo 用`Cargo.lock`文件跟蹤你程序的依賴。這里是 Hello World 項目的`Cargo.lock`文件。這個項目并沒有依賴,所以內容有一點稀少。事實上,你自己甚至都不需要碰這個文件;僅僅讓 Cargo 處理它就行了。 就是這樣!如果你一路跟過來了,你應該已經成功使用 Cargo 構建了`hello_world`。 雖然這個項目很簡單,現在它使用了很多在你余下的 Rust 生涯中將會用到的實際的工具。事實上,你可以期望使用如下命令的變體開始所有的 Rust 項目: ~~~ $ git clone someurl.com/foo $ cd foo $ cargo build ~~~ ### 創建一個新 Cargo 項目的簡單方法 你并不需要每次都過一遍上面的操作來開始一個新的項目!Cargo 可以快速創建一個骨架項目目錄這樣你就可以立即開始開發了。 用 Cargo 來開始一個新項目,在命令行輸入`cargo new`: ~~~ $ cargo new hello_world --bin ~~~ 這個命令傳遞了`--bin`參數因為我們的目標是直接創建一個可執行程序,而不是一個庫。可執行文件通常叫做二進制文件(因為它們位于`/usr/bin`,如果你使用 Unix 系統的話)。 Cargo 為我們創建了兩個文件和一個目錄:一個`Cargo.toml`和一個包含了`main.rs`文件的`src`目錄。這應該看起來很眼熟,他們正好是我們在之前手動創建的那樣。 這些輸出是你開始所需要的一切。首先,打開`Cargo.toml`。它應該看起來像這樣: ~~~ [package] name = "hello_world" version = "0.1.0" authors = ["Your Name <you@example.com>"] ~~~ Cargo 已經根據你給出的參數和`git`全局配置給出了合理的默認配置。你可能會注意到 Cargo 也把`hello_world`目錄初始化為了一個`git`倉庫。 這是應該寫入`src/main.rs`的代碼: ~~~ fn main() { println!("Hello, world!"); } ~~~ Cargo 已經為你生成了一個“Hello World!”,現在你已經準備好開始擼代碼了! > 注意:如果你想要查看 Cargo 的詳細信息,請查看官方的[Cargo 指導](http://doc.crates.io/guide.html),它包含了所有這些功能。 ### 寫在最后(Closing Thoughts) 這個章節覆蓋了將用于本書余下部分以及你之后 Rust 時光的基礎知識。現在你獲得了工具,我們將更多的介紹 Rust 語言本身。 (接下來)你有兩個選擇:在 “[學習 Rust](#)” 中深入研究一個項目,或者自下而上地學習 “[語法和語義](#)”。來自系統級編程語言的同學,你們可能傾向于選擇 “學習 Rust”,而來自動態編程語言的同學,請根據自己的喜好來選擇吧。人各有別,適合自己的才是最好的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看