国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

探索類型系統(tǒng)的底層 - 自己實現(xiàn)一個 TypeScript(硬核干貨)

共 28350字,需瀏覽 57分鐘

 ·

2021-04-14 02:45

原文:https://indepth.dev/under-the-hood-of-type-systems/

DawnL 譯

這篇文章包含兩個部分:

A 部分:類型系統(tǒng)編譯器概述(包括 TypeScript)

  • Syntax vs Semantics 語法 vs 語義
  • What is AST? 什么是 AST?
  • Types of compilers 編譯器的類型
  • What does a language compiler do? 語言編譯器是做什么的?
  • How does a language compiler work? 語言編譯器是如何工作的?
  • Type system compiler jobs 類型系統(tǒng)編譯器職責(zé)
  • Advanced type checker features 高級類型檢查器的功能

B 部分:構(gòu)建我們自己的類型系統(tǒng)編譯器

  • The parser 解析器
  • The checker 檢查器
  • Running our compiler 運行我們的編譯器
  • What have we missed? 我們遺漏了什么?

A 部分:類型系統(tǒng)編譯器概述

語法 vs 語義

語法和語義之間的區(qū)別對于早期的運行很重要。

語法 - Syntax

語法通常是指 JavaScript 本機代碼。本質(zhì)上是詢問給定的 JavaScript 代碼在運行時是否正確。

例如,下面的語法是正確的:

var foo: number = "not a number";

語義 - Semantics

這是特定于類型系統(tǒng)的代碼。本質(zhì)上是詢問附加到代碼中的給定類型是否正確。

例如,上面的代碼在語法上是正確的,但在語義上是錯誤的(將變量定義為一個數(shù)字類型,但是值是一個字符串)。

接下來是 JavaScript 生態(tài)系統(tǒng)中的 AST 和編譯器。

什么是 AST?

在進一步討論之前,我們需要快速了解一下 JavaScript 編譯器中的一個重要機制 AST。

關(guān)于 AST 詳細介紹請看這篇文章。

AST 的意思是抽象語法樹 ,它是一個表示程序代碼的節(jié)點樹。Node 是最小單元,基本上是一個具有 type 和 location 屬性的 POJO(即普通 JavaScript 對象)。所有節(jié)點都有這兩個屬性,但根據(jù)類型,它們也可以具有其他各種屬性。

在 AST 格式中,代碼非常容易操作,因此可以執(zhí)行添加、刪除甚至替換等操作。

例如下面這段代碼:

function add(number{
  return number + 1;
}

將解析成以下 AST:

編譯器類型

在 JavaScript 生態(tài)系統(tǒng)中有兩種主要的編譯器類型:

1. 原生編譯器(Native compiler)

原生編譯器將代碼轉(zhuǎn)換為可由服務(wù)器或計算機運行的代碼格式(即機器代碼)。類似于 Java 生態(tài)系統(tǒng)中的編譯器 - 將代碼轉(zhuǎn)換為字節(jié)碼,然后將字節(jié)碼轉(zhuǎn)換為本機代碼。

2. 語言編譯器

語言編譯器扮演著不同的角色。TypeScript 和 Flow 的編譯器在將代碼輸出到 JavaScript 時都算作語言編譯器。

語言編譯器與原生編譯器的主要區(qū)別在于,前者的編譯目的是 tooling-sake(例如優(yōu)化代碼性能或添加附加功能),而不是為了生成機器代碼。

語言編譯器是做什么的?

在類型系統(tǒng)編譯器中,總結(jié)的兩個最基本的核心職責(zé)是:

1. 執(zhí)行類型檢查

引入類型(通常是通過顯式注解或隱式推理),以及檢查一種類型是否匹配另一種類型的方法,例如 string 和 number

2. 運行語言服務(wù)器

對于一個在開發(fā)環(huán)境中工作的類型系統(tǒng)(type system)來說,最好能在 IDE 中運行任何類型檢查,并為用戶提供即時反饋。

語言服務(wù)器將類型系統(tǒng)連接到 IDE,它們可以在后臺運行編譯器,并在用戶保存文件時重新運行。流行的語言,如 TypeScript 和 Flow 都包含一個語言服務(wù)器。

3. 代碼轉(zhuǎn)換

許多類型系統(tǒng)包含原生 JavaScript 不支持的代碼(例如不支持類型注解) ,因此它們必須將不受支持的 JavaScript 轉(zhuǎn)換為受支持的 JavaScript 代碼。

關(guān)于代碼轉(zhuǎn)換更詳細的介紹,可以參考原作者的這兩篇文章 Web Bundler 和 Source Maps。

語言編譯器是如何工作的?

對于大多數(shù)編譯器來說,在某種形式上有三個共同的階段。

1. 將源代碼解析為 AST

  • 詞法分析 -> 將代碼字符串轉(zhuǎn)換為令牌流(即數(shù)組)
  • 語法分析 -> 將令牌流轉(zhuǎn)換為 AST 表示形式

解析器檢查給定代碼的語法。類型系統(tǒng)必須有自己的解析器,通常包含數(shù)千行代碼。

Babel 解析器 中的 2200+ 行代碼,僅用于處理 statement 語句(請參閱此處)。

Hegel 解析器將 typeAnnotation 屬性設(shè)置為具有類型注解的代碼(可以在這里看到)。

TypeScript 的解析器擁有 8900+ 行代碼(這里是它開始遍歷樹的地方)。它包含了一個完整的 JavaScript 超集,所有這些都需要解析器來理解。

2. 在 AST 上轉(zhuǎn)換節(jié)點

  • 操作 AST 節(jié)點

這里將執(zhí)行應(yīng)用于 AST 的任何轉(zhuǎn)換。

3. 生成源代碼

  • 將 AST 轉(zhuǎn)換為 JavaScript 源代碼字符串

類型系統(tǒng)必須將任何非 js 兼容的 AST 映射回原生 JavaScript。

類型系統(tǒng)如何處理這種情況呢?

類型系統(tǒng)編譯器(compiler)職責(zé)

除了上述步驟之外,類型系統(tǒng)編譯器通常還會在解析之后包括一個或兩個額外步驟,其中包括特定于類型的工作。

順便說一下,TypeScript 的編譯器實際上有 5 個階段,它們是:

  1. 語言服務(wù)預(yù)處理器 - Language server pre-processor
  2. 解析器 - Parser
  3. 結(jié)合器 - Binder
  4. 檢查器 - Checker
  5. 發(fā)射器 - Emitter

正如上面看到的,語言服務(wù)器包含一個預(yù)處理器,它觸發(fā)類型編譯器只在已更改的文件上運行。這會監(jiān)聽任意的 import 語句,來確定還有哪些內(nèi)容可能發(fā)生了更改,并且需要在下次重新運行時攜帶這些內(nèi)容。

此外,編譯器只能重新處理 AST 結(jié)構(gòu)中已更改的分支。關(guān)于更多 lazy compilation,請參閱下文。

類型系統(tǒng)編譯器有兩個常見的職責(zé):

1. 推導(dǎo) - Inferring

對于沒有注解的代碼需要進行推斷。關(guān)于這點,這里推薦一篇關(guān)于何時使用類型注解和何時讓引擎使用推斷的文章。

使用預(yù)定義的算法,引擎將計算給定變量或者函數(shù)的類型。

TypeScript 在其 Binding 階段(兩次語義傳遞中的第一次)中使用最佳公共類型算法。它考慮每個候選類型并選擇與所有其他候選類型兼容的類型。上下文類型在這里起作用,也會做為最佳通用類型的候選類型。在這里的 TypeScript 規(guī)范中有更多的幫助。

let zoo: Animal[] = [new Rhino(), new Elephant(), new Snake()];

TypeScript 實際上引入了 Symbols(interface)的概念,這些命名聲明將 AST 中的聲明節(jié)點與其他聲明進行連接,從而形成相同的實體。它們是 TypeScript 語義系統(tǒng)的基本構(gòu)成。

2. 檢查 - Checking

現(xiàn)在類型推斷已經(jīng)完成,類型已經(jīng)分配,引擎可以運行它的類型檢查。他們檢查給定代碼的 semantics。這些類型的檢查有很多種,從類型錯誤匹配到類型不存在。

對于 TypeScript 來說,這是 Checker (第二個語義傳遞) ,它有 20000+ 行代碼。

我覺得這給出了一個非常強大的 idea,即在如此多的不同場景中檢查如此多的不同類型是多么的復(fù)雜和困難。

類型檢查器不依賴于調(diào)用代碼,即如果一個文件中的任何代碼被執(zhí)行(例如,在運行時)。類型檢查器將處理給定文件中的每一行,并運行適當(dāng)?shù)臋z查。

高級類型檢查器功能

由于這些概念的復(fù)雜性,我們今天不深入探討以下幾個概念:

懶編譯 - Lazy compilation

現(xiàn)代編譯的一個共同特征是延遲加載。他們不會重新計算或重新編譯文件或 AST 分支,除非絕對需要。

TypeScript 預(yù)處理程序可以使用緩存在內(nèi)存中的前一次運行的 AST 代碼。這將大大提高性能,因為它只需要關(guān)注程序或節(jié)點樹的一小部分已更改的內(nèi)容。

TypeScript 使用不可變的只讀數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)存儲在它所稱的 look aside tables 中。這樣很容易知道什么已經(jīng)改變,什么沒有改變。

穩(wěn)健性

在編譯時,有些操作編譯器不確定是安全的,必須等待運行時。每個編譯器都必須做出困難的選擇,以確定哪些內(nèi)容將被包含,哪些不會被包含。TypeScript 有一些被稱為不健全的區(qū)域(即需要運行時類型檢查)。

我們不會在編譯器中討論上述特性,因為它們增加了額外的復(fù)雜性,對于我們的小 POC 來說不值得。

現(xiàn)在令人興奮的是,我們自己也要實現(xiàn)一個編譯器。

B 部分:構(gòu)建我們自己的類型系統(tǒng)編譯器

我們將構(gòu)建一個編譯器,它可以對三個不同的場景運行類型檢查,并為每個場景拋出特定的信息。

我們將其限制在三個場景中的原因是,我們可以關(guān)注每一個場景中的具體機制,并希望到最后能夠?qū)θ绾我敫鼜?fù)雜的類型檢查有一個更好的構(gòu)思。

我們將在編譯器中使用函數(shù)聲明和表達式(調(diào)用該函數(shù))。

這些場景包括:

1. 字符串與數(shù)字的類型匹配問題

fn("craig-string"); // throw with string vs number
function fn(a: number{}

2. 使用未定義的未知類型

fn("craig-string"); // throw with string vs ?
function fn(a: made_up_type{} // throw with bad type

3. 使用代碼中未定義的屬性名

interface Person {
  name: string;
}
fn({ nam"craig" }); // throw with "nam" vs "name"
function fn(a: Person{}

實現(xiàn)我們的編譯器,需要兩部分:解析器檢查器

解析器 - Parser

前面提到,我們今天不會關(guān)注解析器。我們將遵循 Hegel 的解析方法,假設(shè)一個 typeAnnotation 對象已經(jīng)附加到所有帶注解的 AST 節(jié)點中。我已經(jīng)硬編碼了 AST 對象。

場景 1 將使用以下解析器:

字符串與數(shù)字的類型匹配問題

function parser(code{
  // fn("craig-string");
  const expressionAst = {
    type"ExpressionStatement",
    expression: {
      type"CallExpression",
      callee: {
        type"Identifier",
        name"fn"
      },
      arguments: [
        {
          type"StringLiteral"// Parser "Inference" for type.
          value: "craig-string"
        }
      ]
    }
  };

  // function fn(a: number) {}
  const declarationAst = {
    type"FunctionDeclaration",
    id: {
      type"Identifier",
      name"fn"
    },
    params: [
      {
        type"Identifier",
        name"a",
        // 參數(shù)標(biāo)識
        typeAnnotation: {
          // our only type annotation
          type: "TypeAnnotation",
          typeAnnotation: {
            // 數(shù)字類型
            type: "NumberTypeAnnotation"
          }
        }
      }
    ],
    body: {
      type"BlockStatement",
      body: [] // "body" === block/line of code. Ours is empty
    }
  };

  const programAst = {
    type"File",
    program: {
      type"Program",
      body: [expressionAst, declarationAst]
    }
  };
  // normal AST except with typeAnnotations on
  return programAst;
}

可以看到場景 1 中,第一行 fn("craig-string") 語句的 AST 對應(yīng) expressionAst,第二行聲明函數(shù)的 AST 對應(yīng) declarationAst。最后返回一個 programmast,它是一個包含兩個 AST 塊的程序。

在AST中,您可以看到參數(shù)標(biāo)識符 a 上的 typeAnnotation,與它在代碼中的位置相匹配。

場景 2 將使用以下解析器:

使用未定義的未知類型

function parser(code{
  // fn("craig-string");
  const expressionAst = {
    type"ExpressionStatement",
    expression: {
      type"CallExpression",
      callee: {
        type"Identifier",
        name"fn"
      },
      arguments: [
        {
          type"StringLiteral"// Parser "Inference" for type.
          value: "craig-string"
        }
      ]
    }
  };

  // function fn(a: made_up_type) {}
  const declarationAst = {
    type"FunctionDeclaration",
    id: {
      type"Identifier",
      name"fn"
    },
    params: [
      {
        type"Identifier",
        name"a",
        typeAnnotation: {
          // our only type annotation
          type: "TypeAnnotation",
          typeAnnotation: {
            // 參數(shù)類型不同于場景 1
            type: "made_up_type" // BREAKS
          }
        }
      }
    ],
    body: {
      type"BlockStatement",
      body: [] // "body" === block/line of code. Ours is empty
    }
  };

  const programAst = {
    type"File",
    program: {
      type"Program",
      body: [expressionAst, declarationAst]
    }
  };
  // normal AST except with typeAnnotations on
  return programAst;
}

場景 2 的解析器的表達式、聲明和程序 AST 塊非常類似于場景 1。然而,區(qū)別在于 params 內(nèi)部的 typeAnnotation 是 made_up_type,而不是場景 1 中的 NumberTypeAnnotation

typeAnnotation: {
  type"made_up_type" // BREAKS
}

場景 3 使用以下解析器:

使用代碼中未定義的屬性名

function parser(code{
  // interface Person {
  //   name: string;
  // }
  const interfaceAst = {
    type"InterfaceDeclaration",
    id: {
      type"Identifier",
      name"Person",
    },
    body: {
      type"ObjectTypeAnnotation",
      properties: [
        {
          type"ObjectTypeProperty",
          key: {
            type"Identifier",
            name"name",
          },
          kind"init",
          methodfalse,
          value: {
            type"StringTypeAnnotation",
          },
        },
      ],
    },
  };

  // fn({nam: "craig"});
  const expressionAst = {
    type"ExpressionStatement",
    expression: {
      type"CallExpression",
      callee: {
        type"Identifier",
        name"fn",
      },
      arguments: [
        {
          type"ObjectExpression",
          properties: [
            {
              type"ObjectProperty",
              methodfalse,
              key: {
                type"Identifier",
                name"nam",
              },
              value: {
                type"StringLiteral",
                value"craig",
              },
            },
          ],
        },
      ],
    },
  };

  // function fn(a: Person) {}
  const declarationAst = {
    type"FunctionDeclaration",
    id: {
      type"Identifier",
      name"fn",
    },
    params: [
      {
        type"Identifier",
        name"a",
        // 
        typeAnnotation: {
          type"TypeAnnotation",
          typeAnnotation: {
            type"GenericTypeAnnotation",
            id: {
              type"Identifier",
              name"Person",
            },
          },
        },
      },
    ],
    body: {
      type"BlockStatement",
      body: [], // Empty function
    },
  };

  const programAst = {
    type"File",
    program: {
      type"Program",
      body: [interfaceAst, expressionAst, declarationAst],
    },
  };
  // normal AST except with typeAnnotations on
  return programAst;
}

除了表達式、聲明和程序 AST 塊之外,還有一個 interfaceAst 塊,它負責(zé)保存 InterfaceDeclaration AST。

declarationAst 塊的 typeAnnotation 節(jié)點上有一個 GenericType,因為它接受一個對象標(biāo)識符,即 Person。在這個場景中,programAst 將返回這三個對象的數(shù)組。

解析器的相似性

從上面可以得知,這三種有共同點, 3 個場景中保存所有的類型注解的主要區(qū)域是 declaration。

檢查器

現(xiàn)在來看編譯器的類型檢查部分。

它需要遍歷所有程序主體的 AST 對象,并根據(jù)節(jié)點類型進行適當(dāng)?shù)念愋蜋z查。我們將把所有錯誤添加到一個數(shù)組中,并返回給調(diào)用者以便打印。

在我們進一步討論之前,對于每種類型,我們將使用的基本邏輯是:

  • 函數(shù)聲明:檢查參數(shù)的類型是否有效,然后檢查函數(shù)體中的每個語句。

  • 表達式:找到被調(diào)用的函數(shù)聲明,獲取聲明上的參數(shù)類型,然后獲取函數(shù)調(diào)用表達式傳入的參數(shù)類型,并進行比較。

代碼

以下代碼中包含 typeChecks 對象(和 errors 數(shù)組) ,它將用于表達式檢查和基本的注解(annotation)檢查。

const errors = [];

// 注解類型
const ANNOTATED_TYPES = {
  NumberTypeAnnotation"number",
  GenericTypeAnnotationtrue
};

// 類型檢查的邏輯
const typeChecks = {
  // 比較形參和實參的類型
  expression: (declarationFullType, callerFullArg) => {
    switch (declarationFullType.typeAnnotation.type) {
      // 注解為 number 類型
      case "NumberTypeAnnotation":
        // 如果調(diào)用時傳入的是數(shù)字,返回 true
        return callerFullArg.type === "NumericLiteral";
      // 注解為通用類型
      case "GenericTypeAnnotation"// non-native
        // 如果是對象,檢查對象的屬性
        if (callerFullArg.type === "ObjectExpression") {
          // 獲取接口節(jié)點
          const interfaceNode = ast.program.body.find(
            node => node.type === "InterfaceDeclaration"
          );
          const properties = interfaceNode.body.properties;

          //遍歷檢查調(diào)用時的每個屬性
          properties.map((prop, index) => {
            const name = prop.key.name;
            const associatedName = callerFullArg.properties[index].key.name;
            // 沒有匹配,將錯誤信息存入 errors
            if (name !== associatedName) {
              errors.push(
                `Property "${associatedName}" does not exist on interface "${interfaceNode.id.name}". Did you mean Property "${name}"?`
              );
            }
          });
        }
        return true// as already logged
    }
  },
  annotationCheckarg => {
    return !!ANNOTATED_TYPES[arg];
  }
};

讓我們來看一下代碼,我們的 expression 有兩種類型的檢查:

  • 對于 NumberTypeAnnotation; 調(diào)用時類型應(yīng)為 AnumericTeral(即,如果注解為數(shù)字,則調(diào)用時類型應(yīng)為數(shù)字)。場景 1 將在此處失敗,但未記錄任何錯誤信息。

  • 對于 GenericTypeAnnotation; 如果是一個對象,我們將在 AST 中查找 InterfaceDeclaration 節(jié)點,然后檢查該接口上調(diào)用者的每個屬性。之后將所有錯誤信息都會被存到 errors 數(shù)組中,場景 3 將在這里失敗并得到這個錯誤。

我們的處理僅限于這個文件中,大多數(shù)類型檢查器都有作用域的概念,因此它們能夠確定聲明在運行時的準(zhǔn)確位置。我們的工作更簡單,因為它只是一個 POC。

以下代碼包含程序體中每個節(jié)點類型的處理。這就是上面調(diào)用類型檢查邏輯的地方。

// Process program
ast.program.body.map(stnmt => {
  switch (stnmt.type) {
    case "FunctionDeclaration":
      stnmt.params.map(arg => {
        // Does arg has a type annotation?
        if (arg.typeAnnotation) {
          const argType = arg.typeAnnotation.typeAnnotation.type;
          // Is type annotation valid
          const isValid = typeChecks.annotationCheck(argType);
          if (!isValid) {
            errors.push(
              `Type "${argType}" for argument "${arg.name}" does not exist`
            );
          }
        }
      });

      // Process function "block" code here
      stnmt.body.body.map(line => {
        // Ours has none
      });

      return;
    case "ExpressionStatement":
      const functionCalled = stnmt.expression.callee.name;
      const declationForName = ast.program.body.find(
        node =>
          node.type === "FunctionDeclaration" &&
          node.id.name === functionCalled
      );

      // Get declaration
      if (!declationForName) {
        errors.push(`Function "${functionCalled}" does not exist`);
        return;
      }

      // Array of arg-to-type. e.g. 0 = NumberTypeAnnotation
      const argTypeMap = declationForName.params.map(param => {
        if (param.typeAnnotation) {
          return param.typeAnnotation;
        }
      });

      // Check exp caller "arg type" with declaration "arg type"
      stnmt.expression.arguments.map((arg, index) => {
        const declarationType = argTypeMap[index].typeAnnotation.type;
        const callerType = arg.type;
        const callerValue = arg.value;

        // Declaration annotation more important here
        const isValid = typeChecks.expression(
          argTypeMap[index], // declaration details
          arg // caller details
        );

        if (!isValid) {
          const annotatedType = ANNOTATED_TYPES[declarationType];
          // Show values to user, more explanatory than types
          errors.push(
            `Type "${callerValue}" is incompatible with "${annotatedType}"`
          );
        }
      });

      return;
  }
});

讓我們再次遍歷代碼,按類型對其進行分解。

FunctionDeclaration (即 function hello(){})

首先處理 arguments/params。如果找到類型注解,就檢查給定參數(shù)的類型 argType 是否存在。如果不進行錯誤處理,場景 2 會在這里報錯誤。

之后處理函數(shù)體,但是我們知道沒有函數(shù)體需要處理,所以我把它留空了。

stnmt.body.body.map(line => {
  // Ours has none
});

ExpressionStatement (即 hello())

首先檢查程序中函數(shù)的聲明。這就是作用域?qū)?yīng)用于實際類型檢查器的地方。如果找不到聲明,就將錯誤信息添加到 errors 數(shù)組中。

接下來,我們針對調(diào)用時傳入的參數(shù)類型(實參類型)檢查每個已定義的參數(shù)類型。如果發(fā)現(xiàn)類型不匹配,則向 errors 數(shù)組中添加一個錯誤。場景 1 和場景 2 在這里都會報錯。

運行我們的編譯器

源碼存放在這里,該文件一次性處理所有三個 AST 節(jié)點對象并記錄錯誤。

運行它時,我得到以下信息:

總而言之:

場景 1:

fn("craig-string"); // throw with string vs number
function fn(a: number{}

我們定義參數(shù)為 number 的類型,然后用字符串調(diào)用它。

場景 2:

fn("craig-string"); // throw with string vs ?
function fn(a: made_up_type{} // throw with bad type

我們在函數(shù)參數(shù)上定義了一個不存在的類型,然后調(diào)用我們的函數(shù),所以我們得到了兩個錯誤(一個是定義的錯誤類型,另一個是類型不匹配的錯誤)。

場景 3:

interface Person {
  name: string;
}
fn({ nam"craig" }); // throw with "nam" vs "name"
function fn(a: Person{}

我們定義了一個接口,但是使用了一個名為 nam 的屬性,這個屬性不在對象上,錯誤提示我們是否要使用 name。

我們遺漏了什么?

如前所述,類型編譯器還有許多其他部分,我們在編譯器中省略了這些部分。其中包括:

  • 解析器:我們是手動編寫的 AST 代碼,它們實際上是在類型的編譯器上解析生成。
  • 預(yù)處理/語言編譯器: 一個真正的編譯器具有插入 IDE 并在適當(dāng)?shù)臅r候重新運行的機制。
  • 懶編譯:沒有關(guān)于更改或內(nèi)存使用的信息。
  • 轉(zhuǎn)換:我們跳過了編譯器的最后一部分,也就是生成本機 JavaScript 代碼的地方。
  • 作用域:因為我們的 POC 是一個單一的文件,它不需要理解作用域的概念,但是真正的編譯器必須始終知道上下文。

非常感謝您的閱讀和觀看,我從這項研究中了解了大量關(guān)于類型系統(tǒng)的知識,希望對您有所幫助。以上完整代碼您可以在這里找到。(給原作者 start)

備注:

原作者在源碼中使用的 Node 模塊方式為 ESM(ES Module),在將源碼克隆到本地后,如果運行不成功,需要修改 start 指令,添加啟動參數(shù) --experimental-modules。

"start""node --experimental-modules src/index.mjs",

END



如果覺得這篇文章還不錯
點擊下面卡片關(guān)注我
來個【分享、點贊、在看】三連支持一下吧

   “分享、點贊、在看” 支持一波  

瀏覽 58
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 久久精品99国产国产精| 少妇激情av| 黄色激情av| 国产亚洲久一区二区写真| 人人妻人人爽人人澡人人精品| 婷婷丁香五月亚洲| 操熟女视频| 久久久www成人免费毛片| 免费在线观看AV| 国产一二三| 国产黄色免费电影| 国产精品久久久久久久牛牛| 伊人综合干| 成人大战香蕉最新视频| 天堂中文在线视频| 国产一级aa| 亚洲不卡中文字幕| 亚洲乱伦图| 久久精品无码一区二区无码性色| 亚洲欧洲无码在线| 一夲道无码专区av无码A片| 欧美日韩免费一区二区三区| 国产卡一卡二| 最近最经典中文MV字幕| 精品一区二区三区无码| 欧美成人精品A片免费一区99| 欧美三级视频| 国产一区二区无码| 狠狠干大香蕉| 肏逼视频网站| 综合偷拍| 日韩视频91| 亚洲青娱乐在线| 肏逼黄色一级| 亚洲日韩一区| 97色色网| 国产又爽又黄免费网站在线观看| 欧美性爱视频在线观看| 日日日操| 七六十路の高齢熟妇无码| 丁香五月天天| 在线观看中文字幕无码| 丁香五月婷婷视频| 久久无码影院| 欧美韩日高清精彩视频| 黄网站免费观看| 青青草视频在线免费观看| 久草视频观看| 2025av天堂| 性爱麻豆| 黄色a级片| 丁香六月婷婷综合缴| 国产精品乱码一区二区三区| 四季AV一区二区凹凸懂色桃花| 乳揉みま痴汉电车羽月希免费观看 | 色噜噜狠狠一区二区三区300部| 性猛交╳XXX乱大交| 男人天堂成人| 国产小视频在线观看| 久久婷婷秘精品日产538| 色婷婷影院| 强伦轩一区二区三区四区| 手机在线看A片| 一级无码在线观看| 精品日逼| 一个人看的视频www| 一级a一级a免费观看免免黄‘/ | 亚洲欧美日韩高清| 大香蕉在线看| 无码欧美成人AAAA三区在线| 欧美日韩国产成人电影| 台湾精品一区二区三区| 热re99久久精品国产99热| 国产无码内射视频| 一级片三级片| 国产一级免费观看| 亚洲视频综合网| 大屌av| 北条麻妃在线观看香蕉| 美少妇AV| 国产激情都市一区二区三区欧美 | 波多野结衣亚洲视频| 亚洲精品久久久久久久久蜜桃| 国产视频h| 久久看片| 91久久午夜无码鲁丝片久久人妻| 日本高清久久| 国产日韩二区| 男人的天堂aa| 黄色日逼网站| 99国产免费| 欧美污视频在线观看| 在线播放一区二区三区| 亚洲国产一| 18禁网站在线播放| 亚洲午夜福利视频在线观看| 日韩中文字幕在线高清| 日韩欧美高清无码| 亚洲高清无码视频在线播放| 亚洲AV无码乱码A片无码沈樵| 91视频美女| 日本少妇高潮喷水XXXXXXX| 学生妹一级| 亚洲最新无码视频| 狠狠色噜噜狠狠狠7777米奇网| 国产三级片视频在线观看| 日韩性爱视频在线播放| 操一线天逼| 水蜜桃视频网站在线观看| 亚洲高清视频无码| 国产高清激情| 国产suv精品一区二区6精华液 | 在线亚洲色图| 激情综合网五月| 丰满人妻一区二区三区视频54| 91香蕉视频免费在线观看| 在线免费观看网站| 欧美a片在线观看| 2025av在线| 中文字幕乱码中文字幕电视剧| 豆花视频成人版www满18| 欧美一区二区三区免费| 国产插逼视频| 丁香六月综合| 高清无码视频在线免费观看| 亚洲中文字幕免费观看| 欧美性爱一区二区| 久操大香蕉| 尻屄视频| 极品小仙女69| 欧美在线国产| 国产青草视频在线观看| 先锋资源国产| 少妇厨房愉情理伦BD在线观| 好逼天天有| 国产精品天天| 亚洲男人天堂视频| 日本熟妇高潮BBwBBwBBw| 亚洲福利在线观看视频| 精品久久久久久久久久久| 91成人免费电影| www.黄色视频| 亚洲一区视频| 91一区二区| 日韩乱轮小说与视频| 午夜成人黄色| 超碰永久| www.啪啪啪| 国产精品每日更新| 中文在线字幕免费观| aa免费视频| 可以免费看的av| 国产三级自拍视频| 777在线视频| 亚洲天堂在线视频| 激情视频免费看| 99久久人妻精品免费二区| av网站导航| 国产成人自拍偷拍视频| 亚洲成人AV电影| 欧美男人的天堂| 一区二区三区免费看| 伊人久久网站| 免费无码高清| 翔田千里无码在线观看| 国产精品无码乱伦| 亚洲免费大片| 天码人妻一区二区三区在线看| 日韩免费成人| 亚洲成人无码AV| 江苏妇搡BBBB搡BBB| 狠狠干| 国产a一级a毛一级视频| 中文字幕无码Av在线| 亚洲在线a| 国产成人精品一区二| 欧洲成人在线视频| av高清| 久久高清免费视频| 麻豆黄网| 成人网站大香蕉| 久久久精品网站| 日韩欧美V| 国精产品一区一区三区四川| 亚洲高清无码在线| 就去色色五月丁香婷婷久久久| 天天撸天天色| 黄片网站免费在线观看| 色九九| 手机免费Av| 国产精品毛片VA一区二区三区| 欧美成人手机在线看片| 国产精品成人免费久久黄AV片 | 337p粉嫩噜噜噜| 亚洲色色色| 欧美性猛交XXXX乱大交| 国产精品福利视频| 俺来也操逼| 亚洲精品日日夜夜| 久久久久久久免费无码| 日本黄色录像| 一级黄色a片| 啪啪啪啪网站| 老司机福利在线视频| 午夜福利123| 操夜夜操| 少妇综合网| 97福利视频| 亚洲欧美激情视频| 少妇做爱特级AAA| 日韩视频区| 成人福利网| 免费黄色成人网站| 日韩无码人妻系列| 免费一级AAAAA片在线播放| 亚洲精品无码a片| 青青成人| 欧美成人图片视频在线| 欧美成综合| ChineSe露脸老女人| 制服丝袜大香蕉| 免费黄片在线看| а√在线中文网新版地址在线| www激情| 黄色电影视频网站| 91精品视频在线播放| 无码秘蜜桃一区二区| 99久久久久久久久久| 狠狠躁日日躁夜夜躁A片男男视频 精品无码一区二区三区蜜桃李宗瑞 | 亚洲色影院| 蝌蚪窝免费在线视频| 国产一级a毛一级a毛观看视频网站www.jn | 国产毛片网| 特级黄色片| 成人在线伊人| 一区二区三区日本| 久久九九国产| 日本无码在线| 无码AV天堂| 国产乱仑视频| 性猛交AAAA片免费看蜜桃视频| 国产黄色在线观看| 久一在线| 最近中文字幕在线中文字幕7| 黄色免费大片| 成人A电影| av资源观看| 亚洲无码人妻| 青青草原亚洲| 国产一级AA片| 超碰成人97| 日韩中文字幕无码| 北条麻妃无码在线视频| 一本色道综合久久欧美日韩精品 | 大香蕉一区二区三区| 人人澡人人妻人人爽| 久久影音先锋| 国产精品久久免费视频| TheAV精尽人亡av| 亚洲美女免费视频| 91精品人妻一区二区三区蜜桃| 先锋影音亚洲AV每日资源网站 | 日本少妇视频| 香蕉国产在线| 伊人大综合| 日韩一区二区视频| 成人中文字幕网站| 北条麻纪无码视频| 成人做爰A片AAA毛真人| 1024手机在线观看| 成人aV无码精品国产一区二区 | 日韩在线观看一区| 人妻在线你懂的| 欧美黄色一级网站| 黄片免费视频观看| 精品第一页| 亚洲Av无码午夜国产精品色软件| 中文一区| 高清无码在线免费观看| 欧美成人综合一区| 大黄网站在线观看| 蜜桃91精品秘入口| 操逼999| 日韩色综合| 在线无码| 人人艹在线| 午夜成人视频| 亚洲国产精品成人网站| 99热综合在线| 深爱五月婷婷| 四库影库| 美女福利在线| 黄色直播在线观看| 国产清纯可爱美女自卫裸贷偷情| 91熊猫| 日韩成人网址| 亚洲国产精品欧美久久| 一本色道久久综合| 精品操逼| 精品尤物在线| 国产黄色免费乱伦片| 国产在线观看欧美| 免费成人高清视频| 大香蕉日韩| 国产成人69免费看| 大香蕉精品在线视频| 国产成人精品八戒| 2025无码视频| 一道本无吗一区| 最美人妖系列国产Ts涵涵| 久久国际精品| 天天干天天摸| 豆花视频无码| 成年人黄色网址| 艹逼视频免费观看| 天天干天天舔| 四虎无码丰满人妻| 夜色视频网| 国产精品h| 另类aV| 影音先锋资源站| 亚洲人妻电影一区| 自拍偷拍一区二区| 夜夜骚AV一二三区无码| 青草久久网| 国产www在线观看| 西西444WWW无码大胆在线观看| V在线| 乱伦无码高清麻豆视频一区二区| 免费黄色视频网站大全| 欧洲精品在线观看| 天堂视频在线观看亚洲美女 | 搡中国东北老女人视频| 国色天香一区二区| 精品aaa| www.中文字幕| 99国产精品久久久久久久成人| 久久久毛片| 无码专区在线播放| 9I免费看片黄| 亚洲美女视频网| 91久久国产综合久| 韩国三级无码| 影音先锋av中文字幕| 亚洲国产精品成人va在线观看| 在线网址你懂的| 蜜臀久久99精品久久久巴士| 一区二区三区无码区| 男人先锋| 欧美日韩国产成人综合| 日韩无码一级| 免费人成在线观看视频播放| 91在线小视频| 波多野结衣av一区| 69人妻人人澡人人爽人人精品| 欧美性一区| 九色国产视频| 亚洲砖区| 欧美成人三级在线观看| 日韩特黄片| 无码精品视频在线观看| 国产特级毛片AAAAAA| 豆花网| av天天av无码av天天爽| 五月天久久婷婷| 欧美啪啪视频| 色婷婷一级A片AAA毛片| 先锋资源男人站| 精品乱子伦一区二区三区免费播成| 精品国产精品国产精品国产网站 | 久久h| 国产免费www| 大香蕉视频在线观看| 免费无码在线视频| 三级视频网站| 一级无码在线观看| 日韩一级一片内射视频4K| 亚洲欧美成人网站| 3级片网站| 亚洲精品一区二区三区新线路| 成人无码视频在线| 日本三区| 亚洲综合网在线| 亚洲天堂男人| 怡春院首页| av不卡在线| 亚洲一二三四区| 亚洲三级免费| 91欧美性爱| 一区二区三区无码视频| www.人人摸| 国产操比网| 久久久久久久麻豆| 伊人综合色| 日韩AV免费在线| 最近中文字幕av| 五月丁香中文字幕| 美国黄色A片| 国产午夜福利电影| 91在线一区二区三区| 全部免费黄色视频| 老太色HD色老太HD| 久久视频网站| 亚洲女人被黑人巨大进入| 久久久久久久9999| 日本三级视频| 国产成人自拍视频在线观看| 另类老妇性BBBWBBW| 日韩欧美精品一区二区| 91麻豆一区二区| 91人妻无码成人精品一区二区| 国产在线拍揄自揄拍无码男男| 色人人| 五月天久久久久| 俺来也官网欧美久久精品| 国产小视频在线播放| 99久操| 中国操逼视频| 在线观看一区二区三区四区| 青青草原av| 日本综合色| 麻豆精品一区二区三区| 永久免费视频| 国产无码高清在线| 99在线视频观看| 欧美性BBB槡BBB槡BBB| 91久久性奴调教| 俺去啦在线| 超碰成人欧美| 午夜操日在线| 偷拍亚洲欧美| 福利导航页| 91嫖妓站街按摩店老熟女| 蜜臀av在线播放| 午夜成人福利视频| 免费看一区二区三区| AV中文无码| 五月丁香六月| 亚洲成人五月天| 中国老熟女2老女人| 中文视频在线观看| 少妇搡BBBB搡BBB搡HD(| 情趣视频网站| 91丨熟女丨首页| 啪啪免费网| 视频一视频二在线视频| 欧美成人性爱网站| 欧美熟妇另类久久久久久不卡| 中文字幕不卡+婷婷五月| 亚洲激情欧美| 熟妇高潮一区二区高潮| 日韩欧美性爱| 在线激情网站| av天天av无码av天天爽| 热99| 老女人网站| 北条麻妃视频在线播放| 岛国精品在线播放| 黄色a片视频| 亚洲成人怡红院| 亚洲,制服,综合,中文| 可以免费观看的毛片| 天天插在线视频| 97人妻一区二区三区| 中国丰满妇BBwBBwHD| 色骚爽大香蕉91| 免费视频一二三区| 91九色蝌蚪91POR成人| 亚洲高清国产欧美综合s8| 日本特级片| 國產精品777777777| 国产免费看| 另类罕见稀奇videos| 精产国品一区二区三区| 国产不卡精品| 亚洲AV第二区国产精品| 天天夜夜操操| 久久色在线视频| 国产午夜福利视频| 日韩怡春院| 可以看的黄色视频| 天堂A片电影网站在线观看| 九九热超碰| 无码乱码在线观看| 国产三级AV在线观看| 黑人久久| 天天cao| 国产精品色情A级毛片| 欧美性爱在线观看| 久久aa| 九色欧美| A级视频网| 一区二区三区在线观看视频| 视频一区18| 久久国产香蕉| 中文字幕高清免费看| 91九色在线观看| 2019国产精品| 91人妻人人人| 亚洲免费网站| 女生自慰网站在线观看| 熟妇熟女一区二区三区| 男人的天堂视频在线观看| 中文字幕无码av| 免费看黄A级毛片成人片| 中国丰满妇BBwBBwHD| 婷婷五月天激情丁香| 中文字幕第六页| 69婷婷国产精品| 在线看v片| 蜜桃久久久久久久| 国产女18毛片多18精品| 老妇槡BBBB槡BBBB槡| 韩国无码高清视频| 西西www444无码免费视频| 天堂成人| 午夜电影福利| 中文字幕在线乱| 五月丁香婷婷成人| 黄片视频免费看| 黄色激情视频网站| 色婷婷18禁| 蜜桃精品一区二区| 熟女456| 亚洲vs无码秘蜜桃少妇| 国产综合在线播放| 自拍偷拍图区| 日日騒av无码| 狼友视频在在观看| 一道本无吗一区| 国产福利91| av六月天| 国产综合色网| 白浆四溢av| 在线观看黄色电影| 91色综合| 少妇无码在线| 国产乱伦视屏| 日本操B久久| 亚洲欧美视频在线观看| 影音先锋av中文字幕| 日韩中文字幕在线人成网站| 亚洲va欧美va| 日韩大片免费观看| 91无码在线观看| 国产一a毛一a毛A免费| 成人免费黄色片| 99成人在线视频| 欧美精品无码一区二区| 无码成人AV在线看免费| 中文精品字幕人妻熟女| 囯产精品一区二区三区线一牛影视1 | av色欲| 中文字幕乱码免费综合久久| 欧美青青草| 成人黄片免费| 日产精品久久久久| 中文字幕+乱码+中文乱码视频在线观看 | 黄色视频在线观看地址| 亚洲精品国产精品乱码不卡√香蕉 | 夜夜操夜夜爽| 日韩一级在线播放| 黄色免费看视频| 国产高潮又爽又无遮挡又免费| 天天射天天干天天| 男人av网站| 精品操逼| 黄色一级片视频| 日操夜操| 岛国AV片| 在线播放亚洲| 黄页网站视频| 五月婷婷色欲| 国产口爆| 久久久天堂| 国模私拍视频| 91农村站街老熟女露脸| 北条麻妃JUX-869无码播放| 午夜在线无码| 最新av网| AAA片网站| 甘肃WBBBB搡wBBBB| 久久久久久亚洲Av无码精品专口| 热热AV| 国产无码二区| 九九小视频| 欧美成人精品三级网站| 久久久久中文字幕| 丝袜东京热AV高清| 韩国GOGOGO高清| 奇米色色| 五月天激情电影| 国产成人午夜福利在线| 欧美成人黄色A片| 久久偷拍网| 俺来也听听婷婷| 亚洲中文字幕成人| 中文字幕一区三区人妻视频| 亚洲国产另类精品| 黑人av| 尤物av| 亚洲无码AV电影| 中文无码日本一级A片久久影视| 久久精品夜色噜噜亚洲A∨| 日韩欧美中文字幕在线视频 | 91丨PORNY丨丰满人妻网站| 青青草社区| 少妇AV| av无码毛片| 免费的黄色视频在线观看| 精品国产AV色一区二区深夜久久| 99九九99九九九99九他書對| 欧洲尤物不卡播放六区| 波多野结衣无码在线| www.91爱爱,com| 在线看黄片| 99精品免费| AV色色| 国产成人ab| 亚洲欧美日韩激情| 神马午夜视频| 免费黄色视频网站在线观看| 操极品少妇逼| 亚洲午夜福利视频在线观看| 自慰一区| 中文字幕www一区| 中文无码日本高潮喷水| 在线中文字幕在线观看| 蜜桃秘一二三区最新| 亚洲AⅤ| 人妻少妇精品| 水果派AV解说| 熟妇一区| 日本成人中文字幕| 91探花视频精选在线播放| 久久免费视频观看| 天天射天天爽| 女人操逼| 中文字幕不卡在线| 日韩视频精品| 9色网| 淫色五月| 亚洲精品资源在线| 亚洲第一色图| 欧一美一色一伦一A片| 日韩高清无码毛片| A片免费观看视频| 久久精品无码视频| 黄色片网站免费观看| 七十路の高齢熟女千代子下载| 黄片日逼视频| 97精品人妻一区二区三区香蕉| 少妇人妻AV| 大色AV| 狠狠插网站| 亚洲69v久久久无码精品| 成年人视频网| 69成人在线| 国产无码AV成在线| 天天色色天天| 亚洲AV成人无码一区二区三区| 偷拍久久久| 日韩av第一页| AV高清无码在线| 午夜黄色视频在线观看| 午夜激情久久| 青青操成人在线视频| 中文字幕高清| 国产精品无码在线播放| 51妺嘿嘿午夜福利在线| 欧美黄色三级视频| 中文字幕熟女| 日本综合色| 日韩无码操逼视频| 成人欧美视频| 人人艹人人干| 日本免费高清视频| 五月婷婷丁香综合| 欧美视频二区| 九九国产视频| 日日精品| 亚洲成人无码视频| 爆操太妹| 性视频人人| 69成人导航| 国产51视频| 91新婚人妻偷拍| 日本黄色视频。| 996热re视频精品视频| 少婦揉BBBB揉BBBB揉| 1000部毛片A片免费视频| 亚洲秘无码一区二区三区| 成人在线三级片| 日本中文字幕亚洲| 好男人WWW一区二区三区| 日本国产在线观看| 亚洲无码精品久久| 国产一级a毛一级a毛视频在线网站| 在线看黄片| 青青草无码视频| 成人在线视频观看| 久久久久久久| 一级艹逼| 69亚洲视频| 国产又粗又长又硬又大毛苴茸图片 | 天天色天天干天天日| 逼特逼在线观看| 午夜精品视频| 九九九成人视频| 精品一区二区三区av| 久久艹精品视频| 欧美一区在线视频| 亚洲一| 18禁污网站| 777.av| 久久久久性爱| 狠狠躁日日躁夜夜躁A片无码| 在线观看高清无码视频| 亚洲一级二级三级| 黄色大片AV在线| 天堂v在线观看| 国精品无码一区二区三区在线 | 一区二区三区四区在线播放| 人人草人人操| 荫蒂添出高潮A片视频| 天天干天天操| 国产成人AV| 国产精品秘精东影业| 亚洲jiZZjiZZ日本少妇| 久热人妻| 天天爽天天爽夜夜爽毛片| 精品久久一区二区| 91探花视频在线观看| 91三级| 91丨露脸丨熟女| 亚洲黄色天堂| 西西444WWW无码视频软件功能介绍| 黄色片AA| 看免费黄色视频| 亚洲中文字幕在线视频观看| 无码av中文字幕| 黄网免费在线观看| 69av在线观看| 國模久久| 午夜日屄| 国产一级片内射| 91黄色视频网站| 台湾成人视频| 亚洲综合免费观看| 午夜毛片| 国产AV高潮| 久久毛片基地| 性爱AV天堂| 国产精品免费观看视频| 精品自拍视频| 日本中文字幕在线观看| 亚洲福利久久| 看A片在线| 免费性爱网站| 天天综合7799| 日韩精品久久久久久久| 亚洲视频区| 一起操逼| 操B国产| 国产精品视频在线免费观看| 91导航| 成年人黄色网址| 欧美成人18| 欧美A片在线免费观看| 99久久精品国产成人一区二区| 91香蕉视频免费在线观看| 99免费观看视频| 中文字字幕在线中文乱码| 欧美成人一区免费视频| 人人看人人摸人人插| AV天堂资源| 毛片毛片毛片毛片毛片| 超碰p| 久久草| av无码导航| 国产三级精品三级在线观看| 国产永久精品| 免费亲子乱婬一级A片| 欧美成人A片在线观看| 大黑逼AV| 免费视频在线观看一区| 日本高清无码在线观看| 久久中文视频| 电影豹妹香港版| 久热中文在线观看精品视频| 日韩A∨| 青草草在线| 天天天操| 国产又大又粗又爽| 无码AV电影在线观看| 久久另类TS人妖一区二区| 亚洲视频国产| 亚洲成人视频在线观看| 亚洲AV资源在线| 日韩人妻无码电影| 欧美综合精品| 亚洲天堂一区| 国产一级二级三级视频| 国产无码高清在线观看| 国产乱伦对白| 成人精品免费视频| 午夜福利av在线| 热九九热| 亚洲成人五月天| 成人A片在线观看| 日韩黄色电影在线免费观看| 18网站视频| 三上悠亚无码破解69XXX| 欧美性爱视频免费看| 91蝌蚪久久| av手机天堂网| 想要xx| 欧美日韩免费在线观看| 激情小视频国产在线播放| 996热re视频精品视频| 初尝人妻滑进去了莹莹视频| 欧美成人a| 天天色色婷婷| 无码三级av| 国产精品乱子伦视频一区二区| 久久久久久av| 国产一级免费在线观看| 久草在| 无码成人av| 黄色国产视频| 337P大胆粉嫩银噜噜噜| 99热国产在线观看| aa无码| 搞搞网日本9| 成人免费操| 强伦轩一区二区三区四区| 欧美日韩一| 国产AV综合网| 精品无码一区二区三区免费| 中文字幕+乱码+中文乱码www| 国产精品久久久无码专区| 国产三级片91| 婷婷丁香五月综合| 成人黄色在线观看| 成年视频在线观看| 日韩天堂网| 青青伊人网| 专肏老妇人大逼| 中文字幕在线观看二区| 天天做天天爱天天爽| 黄片Av| 男女av网站| 天天射天天爽| 天天日很很操| 日本一级黄色| 国产最新视频| 亚欧av无码| 久久久久久免费| 成人做爰黄AA片免费看三区| 丝袜人妻被操视频| 我要操逼网| 欧美黄色毛片| 欧美人操逼一二区| 一级黄色电影免费在线观看| 人妻熟妇乱子伦精品无码专区毛片 | 黄色午夜福利| 在线免费高清无码| 国产sm视频| 日本女人操逼视频| 亚洲不卡在线| 精品一区二区三区视频| 亚洲无码第一页| 超碰91人人操| 老婆中文字幕乱码中文乱码| 豆花视频在线| 俺去也在线播放| x88AV吊钟奶熟女| 國產美女AV操逼網站| 中国一级片| 久久91欧美特黄A片| 手机看片福利永久| 97国产精品手机| 无码精品一区二区| 免费aa片| 久99久视频| 日本黄色电影网址| 91大神精品| 欧洲成人在线观看| 日韩欧美在线视频| av在线三级| 久久77| 99亚洲无码| 亚洲激情在线观看| 日韩一级二级| 在线免费观看av网站| 国产又爽又黄在线看视频| 高清无码学生妹| 国产成人精品久久| 永久黄网站| 欧美老女人逼|