Functions এবং Procedures (ফাংশন এবং প্রসিডিউর)

প্যাসক্যাল (Pascal) - Computer Programming

235

প্যাসক্যাল ভাষায় ফাংশন এবং প্রসিডিউর প্রোগ্রামিংয়ের মূল উপাদান। এগুলি আপনাকে কোড পুনঃব্যবহারযোগ্যতা এবং সংগঠনের সুবিধা দেয়। ফাংশন এবং প্রসিডিউর মূলত কোডের অংশ, যা নির্দিষ্ট কাজ সম্পাদন করে, এবং পরে প্রয়োজনে বারবার ডাকা যায়।


১. ফাংশন (Function)

ফাংশন এমন একটি ব্লক কোড যা একটি নির্দিষ্ট কাজ করে এবং তার ফলাফল (output) ফেরত (return) দেয়। ফাংশন সাধারণত value-returning হয়, অর্থাৎ এটি একটি মান (value) ফিরিয়ে দেয়, যা পরবর্তী কোডে ব্যবহার করা যেতে পারে।

ফাংশন তৈরি করা:

প্যাসক্যালের মধ্যে ফাংশন তৈরি করতে, প্রথমে function কীওয়ার্ড ব্যবহার করতে হয়। তারপরে, ফাংশনের নাম, আর্গুমেন্ট (যদি থাকে) এবং রিটার্ন টাইপ ডিফাইন করতে হয়। ফাংশন শেষে begin এবং end দিয়ে কোড ব্লকটি ঘেরা থাকে।

উদাহরণ:

program FunctionExample;

function Add(a, b: Integer): Integer;
begin
  Add := a + b;  // Function returns the sum of a and b
end;

begin
  writeln('Sum: ', Add(10, 20));  // Calling the function and printing the result
end.

উপরে দেওয়া প্রোগ্রামে, Add ফাংশনটি দুইটি পূর্ণসংখ্যা a এবং b নিয়ে তাদের যোগফল হিসেবে একটি ফলাফল প্রদান করে।

ফাংশনটির কাজ:

  • Add ফাংশনটি দুটি ইনপুট নেবার পর তাদের যোগফল রিটার্ন করে।
  • Add(10, 20) কল করার মাধ্যমে ফাংশনটি ৩০ রিটার্ন করবে, যা আউটপুটে প্রিন্ট হবে।

২. প্রসিডিউর (Procedure)

প্রসিডিউর একটি কোড ব্লক যা একটি নির্দিষ্ট কাজ করে, কিন্তু এটি কোনও মান (value) ফিরিয়ে দেয় না। এটি শুধুমাত্র কার্য সম্পাদন করে, এবং কোনো রিটার্ন ভ্যালু প্রদান করে না।

প্রসিডিউর তৈরি করা:

প্যাসক্যালের মধ্যে প্রসিডিউর তৈরি করতে procedure কীওয়ার্ড ব্যবহার করতে হয়। এর পরে প্রসিডিউরের নাম এবং আর্গুমেন্ট (যদি থাকে) ডিফাইন করা হয়। প্রসিডিউরটি কোডের একটি ব্লক হিসাবে কাজ করে এবং কোন ভ্যালু রিটার্ন করে না।

উদাহরণ:

program ProcedureExample;

procedure Greet(name: string);
begin
  writeln('Hello, ', name);  // Prints a greeting message
end;

begin
  Greet('Alice');  // Calling the procedure
end.

এখানে, Greet প্রসিডিউরটি একটি নাম প্যারামিটার নেয় এবং সেই নামের সাথে একটি শুভেচ্ছা বার্তা প্রিন্ট করে। তবে এটি কোন মান রিটার্ন করে না।

প্রসিডিউরের কাজ:

  • Greet('Alice') কল করলে আউটপুট হবে: Hello, Alice

ফাংশন এবং প্রসিডিউরের মধ্যে পার্থক্য

বৈশিষ্ট্যফাংশন (Function)প্রসিডিউর (Procedure)
রিটার্ন ভ্যালুরিটার্ন ভ্যালু থাকে। (উদাহরণ: Integer, String)কোন রিটার্ন ভ্যালু থাকে না।
ব্যবহারএকটি মান ফেরত দিতে ব্যবহৃত হয়।কোনো নির্দিষ্ট কাজ সম্পাদন করতে ব্যবহৃত হয়।
ডিফাইন করার ধরনfunction কীওয়ার্ড ব্যবহার করে।procedure কীওয়ার্ড ব্যবহার করে।
কল করার সময়ফাংশননাম(অর্গুমেন্ট) দিয়ে কল করা হয়।প্রসিডিউরনাম(অর্গুমেন্ট) দিয়ে কল করা হয়।

সারাংশ

  • ফাংশন হলো একটি কোড ব্লক যা একটি মান (value) রিটার্ন করে, এবং সাধারণত গণনা বা কিছু হিসাব করার কাজে ব্যবহার হয়।
  • প্রসিডিউর হলো একটি কোড ব্লক যা কোনো নির্দিষ্ট কাজ করে, তবে কোনো মান (value) রিটার্ন করে না। এটি সাধারণত কার্য সম্পাদন করার জন্য ব্যবহৃত হয়।

এই দুটি ধারণা আপনাকে কোডকে মডুলার এবং পুনঃব্যবহারযোগ্য করার সুযোগ দেয়।

Content added By

প্যাসক্যাল প্রোগ্রামিং ভাষায় Functions এবং Procedures দুটি অত্যন্ত গুরুত্বপূর্ণ ধারণা। এই দুটি উপাদান প্রোগ্রামের কোডকে আরও সংগঠিত, পুনঃব্যবহারযোগ্য এবং সহজবোধ্য করে তোলে। Functions এবং Procedures মূলত প্রোগ্রামের কোড ব্লক হিসেবে কাজ করে, যা নির্দিষ্ট কাজ সম্পাদন করতে সহায়তা করে।


১. Functions

Functions হল এমন একটি প্রোগ্রামিং উপাদান যা কিছু ইনপুট নিয়ে কাজ করে এবং একটি আউটপুট বা মান প্রদান করে। একটি Function সাধারণত কোনো নির্দিষ্ট গাণিতিক বা লজিক্যাল অপারেশন সম্পাদন করে এবং সেই অপারেশনের ফলাফলকে রিটার্ন করে।

Function-এর গঠন

function FunctionName(parameter1, parameter2: DataType): ReturnType;
begin
  { Function body }
  FunctionName := result;  { return value }
end;

উদাহরণ:

program Example;
function Add(a, b: Integer): Integer;
begin
  Add := a + b;  { Function that returns the sum of a and b }
end;

begin
  writeln(Add(5, 10));  { Output: 15 }
end.

এখানে, Add নামক Function দুটি ইন্টিজার প্যারামিটার নেয় এবং তাদের যোগফল রিটার্ন করে। Add := a + b; এই লাইনে, Add এর মান রিটার্ন করা হয়।

Function-এর বৈশিষ্ট্য

  • Return Value: Function একটি মান রিটার্ন করে।
  • Parameters: Function বিভিন্ন ইনপুট (প্যারামিটার) নিতে পারে।
  • Usage: যখন একটি নির্দিষ্ট মানের হিসাব বা কাজ সম্পাদন করতে হয়, তখন Functions ব্যবহার করা হয়।

২. Procedures

Procedures হলো এমন একটি কোড ব্লক যা কোনো আউটপুট রিটার্ন না করে নির্দিষ্ট কাজ বা ক্রিয়া সম্পাদন করে। Procedures মূলত কোডের পুনঃব্যবহারযোগ্য অংশ হিসেবে ব্যবহৃত হয় এবং এটি কোনো মান ফেরত দেয় না, বরং তার নির্দিষ্ট কাজগুলো সম্পন্ন করে।

Procedure-এর গঠন

procedure ProcedureName(parameter1, parameter2: DataType);
begin
  { Procedure body }
end;

উদাহরণ:

program Example;
procedure PrintHello;
begin
  writeln('Hello, World!');
end;

begin
  PrintHello;  { Output: Hello, World! }
end.

এখানে, PrintHello নামক Procedure কোনো প্যারামিটার নেয় না এবং শুধু একটি নির্দিষ্ট কাজ, যেমন writeln('Hello, World!'), সম্পাদন করে।

Procedure-এর বৈশিষ্ট্য

  • No Return Value: Procedure কোনো মান রিটার্ন করে না, বরং নির্দিষ্ট কাজ সম্পাদন করে।
  • Parameters: Procedure প্যারামিটার গ্রহণ করতে পারে, কিন্তু তা ফিরিয়ে দেয় না।
  • Usage: যখন কোডের পুনঃব্যবহারযোগ্য অংশ তৈরি করতে হয়, তখন Procedures ব্যবহার করা হয়।

Functions এবং Procedures এর মধ্যে পার্থক্য

বিষয়FunctionProcedure
Return Typeএকটি মান রিটার্ন করেকোনো মান রিটার্ন করে না
Usageযখন কোন কাজের ফলাফল প্রয়োজনযখন কোন নির্দিষ্ট কাজ সম্পাদন করা প্রয়োজন
ExampleAdd := a + b;writeln('Hello');
Parametersপ্যারামিটার নিতে পারে এবং মান রিটার্ন করেপ্যারামিটার নিতে পারে কিন্তু মান রিটার্ন করে না

সারাংশ

  • Function একটি কোড ব্লক যা ইনপুট নিয়ে কাজ করে এবং একটি আউটপুট বা মান রিটার্ন করে।
  • Procedure একটি কোড ব্লক যা কাজ করে কিন্তু কোনো মান রিটার্ন করে না।
  • Functions সাধারণত গাণিতিক বা লজিক্যাল অপারেশনের জন্য ব্যবহৃত হয়, যেখানে Procedures সাধারণত নির্দিষ্ট কাজের জন্য ব্যবহৃত হয়।

এই ধারণাগুলি প্যাসক্যাল প্রোগ্রামিং ভাষার মৌলিক অঙ্গ এবং প্রোগ্রামের পুনঃব্যবহারযোগ্য অংশ তৈরি করতে সহায়তা করে।

Content added By

ফাংশন (Function) প্রোগ্রামিং ভাষায় একটি গুরুত্বপূর্ণ ধারণা, যা পুনরায় ব্যবহারযোগ্য কোড ব্লক হিসাবে কাজ করে। ফাংশনকে ব্যবহার করে একাধিক স্থানে একই কোড বারবার লেখা থেকে মুক্তি পাওয়া যায়। প্যাসক্যাল ভাষায় ফাংশনের ডিক্লেয়ারেশন (Declaration) এবং কল (Call) দুটি খুবই গুরুত্বপূর্ণ বিষয়।


১. ফাংশন ডিক্লেয়ারেশন (Function Declaration)

ফাংশন ডিক্লেয়ারেশন হলো একটি ফাংশনের ধরন, নাম এবং আর্গুমেন্ট গুলো সঠিকভাবে নির্ধারণ করা। ফাংশন ডিক্লেয়ারেশন ব্যবহার করে আমরা ফাংশনটির প্রকার এবং পরামিতি (parameters) উল্লেখ করি।

ফাংশন ডিক্লেয়ারেশনের গঠন:

function FunctionName(Param1: ParamType1; Param2: ParamType2): ReturnType;
  • FunctionName: ফাংশনের নাম।
  • Param1, Param2, ...: ফাংশনের ইনপুট প্যারামিটারগুলো (যেগুলি ঐ ফাংশনে প্রেরণ করা হবে)।
  • ParamType1, ParamType2, ...: প্রতিটি প্যারামিটারটির ডেটা টাইপ।
  • ReturnType: ফাংশনটি যে ধরনের মান ফিরিয়ে দেবে।

উদাহরণ:

function Add(a: Integer; b: Integer): Integer;
begin
  Add := a + b;  { ফাংশনটি দুইটি পূর্ণসংখ্যার যোগফল ফেরত দিবে }
end;

এখানে:

  • Add ফাংশনের নাম।
  • a এবং b ইনপুট প্যারামিটার, যা Integer টাইপ।
  • Integer হলো রিটার্ন টাইপ, অর্থাৎ ফাংশনটি একটি পূর্ণসংখ্যা মান ফেরত দেবে।

২. ফাংশন কল (Function Call)

ফাংশন কল হলো ফাংশনটিকে কার্যকর করার প্রক্রিয়া, যেখানে ফাংশনের নাম ও প্যারামিটার পাঠিয়ে তার ফলাফল পাওয়া যায়।

ফাংশন কলের গঠন:

FunctionName(Arg1, Arg2, ...);
  • FunctionName: কল করা ফাংশনের নাম।
  • Arg1, Arg2, ...: ফাংশনে পাঠানো আর্গুমেন্ট বা প্যারামিটার।

উদাহরণ:

program Example;
function Add(a: Integer; b: Integer): Integer;
begin
  Add := a + b;
end;

begin
  writeln(Add(5, 10));  { ফাংশন কল এবং আউটপুট 15 হবে }
end.

এখানে:

  • Add(5, 10) হলো ফাংশন কল, যেখানে 5 এবং 10 আর্গুমেন্ট হিসেবে পাঠানো হয়েছে।
  • ফাংশনটি তাদের যোগফল, অর্থাৎ 15 ফিরিয়ে দেবে, এবং তা writeln দ্বারা আউটপুট করা হবে।

সারাংশ

  • ফাংশন ডিক্লেয়ারেশন (Function Declaration): ফাংশনের নাম, প্যারামিটার এবং রিটার্ন টাইপ নির্ধারণ করা। এটি ফাংশনটি প্রোগ্রামটি কিভাবে কাজ করবে, তা নির্দেশ করে।
  • ফাংশন কল (Function Call): ফাংশনটি কার্যকর করা, যেখানে আর্গুমেন্ট পাঠিয়ে সেই ফাংশনের ফলাফল পাওয়া যায়।

ফাংশন ডিক্লেয়ারেশন এবং কল ব্যবহারের মাধ্যমে কোড পুনঃব্যবহারযোগ্য, পরিষ্কার এবং সহজে পরিচালনাযোগ্য হয়।

Content added By

Procedure (পদ্ধতি) হলো প্যাসক্যাল প্রোগ্রামিং ভাষায় একটি ব্লক যা নির্দিষ্ট কাজ সম্পাদন করে, কিন্তু কোনো মান ফেরত দেয় না। এটি একটি কোড ব্লক যা একাধিক স্থানে ব্যবহার করা যেতে পারে, এবং এটি কোডের পুনরাবৃত্তি কমাতে সাহায্য করে। পদ্ধতি প্রোগ্রামে ফাংশনের মতো কাজ করে, কিন্তু ফাংশন থেকে ভিন্ন, পদ্ধতি কোনো মান ফেরত দেয় না।


Procedure এর গঠন

প্যাসক্যাল ভাষায় একটি procedure সাধারণত নিম্নলিখিত গঠন অনুসরণ করে:

procedure ProcedureName(parameter1: type; parameter2: type);
begin
  { Code block }
end;

এখানে:

  • procedure কীওয়ার্ডটি পদ্ধতি ঘোষণা করার জন্য ব্যবহৃত হয়।
  • ProcedureName হলো পদ্ধতির নাম।
  • parameter1, parameter2 হল প্যারামিটার, যা ইনপুট হিসেবে ব্যবহৃত হয়।
  • { Code block } হল কোড ব্লক যা পদ্ধতির কাজ সম্পাদন করে।

Procedure এর ব্যবহার

Procedure ব্যবহার করতে, প্রথমে একটি পদ্ধতি তৈরি করতে হবে এবং তারপর সেই পদ্ধতিটি প্রোগ্রামের যেকোনো জায়গায় কল (call) করতে হবে।

উদাহরণ: একটি পদ্ধতি যা দুইটি সংখ্যা যোগ করবে

program SumProcedureExample;

procedure AddNumbers(a, b: Integer);
begin
  writeln('Sum is: ', a + b);
end;

begin
  { Calling the AddNumbers procedure }
  AddNumbers(10, 20);  { Output: Sum is: 30 }
end.

এখানে:

  • AddNumbers নামক একটি পদ্ধতি তৈরি করা হয়েছে, যা দুটি পূর্ণসংখ্যা প্যারামিটার নেয় (a এবং b) এবং তাদের যোগফল আউটপুট করে।
  • AddNumbers(10, 20); পদ্ধতিটি কল করা হয়েছে প্রোগ্রামের begin...end. ব্লকের মধ্যে।

Procedure এর বৈশিষ্ট্য

  1. প্যারামিটার (Parameters):
    • পদ্ধতি একটি বা একাধিক প্যারামিটার গ্রহণ করতে পারে, যা ফাংশনের ইনপুট হিসেবে কাজ করে।
    • প্যারামিটার অপশনাল হতে পারে, অর্থাৎ পদ্ধতি কোনো প্যারামিটার ছাড়া কাজ করতে পারে।
  2. রিটার্ন ভ্যালু (Return Value):
    • একটি পদ্ধতি কোনো মান ফেরত দেয় না। যদি কোনো মান ফেরত দেওয়ার প্রয়োজন হয়, তাহলে Function ব্যবহার করা উচিত।
  3. Reusability:
    • পদ্ধতির একটি প্রধান সুবিধা হল কোড পুনরায় ব্যবহার করা। একই পদ্ধতিটি একাধিক স্থানে কল করা যেতে পারে, যা কোডের পুনরাবৃত্তি কমায়।
  4. কোনো সাইড এফেক্ট (Side Effects):
    • পদ্ধতি কোনো বাহ্যিক পরিবর্তন ঘটাতে পারে, যেমন মান পরিবর্তন বা আউটপুট প্রদর্শন করা। এটি মূলত তাদের ইনপুট প্যারামিটার বা গ্লোবাল ভেরিয়েবল দ্বারা পরিচালিত হয়।

Procedure এর আরও উন্নত ব্যবহার

  1. প্যারামিটার দিয়ে পদ্ধতি কল করা:
    আপনি পদ্ধতির মধ্যে প্যারামিটার ব্যবহার করতে পারেন, যা পদ্ধতিতে আরো গতিশীলতা আনে।
  2. ভেরিয়েবল পরিবর্তন:
    পদ্ধতি দ্বারা বাহ্যিক ভেরিয়েবলের মান পরিবর্তন করা সম্ভব। তবে, এটি তখনই সম্ভব যদি প্যারামিটারটি var কীওয়ার্ডের মাধ্যমে পাঠানো হয়, যাতে প্যারামিটারটি রেফারেন্স হিসেবে কাজ করে।

উদাহরণ: var প্যারামিটার সহ পদ্ধতি

program ProcedureWithVar;

procedure ModifyValue(var x: Integer);
begin
  x := x + 5;  { x এর মান পরিবর্তন হচ্ছে }
end;

var
  num: Integer;
begin
  num := 10;
  writeln('Before ModifyValue: ', num);  { Output: Before ModifyValue: 10 }
  
  ModifyValue(num);  { num এর মান 5 বৃদ্ধি পাবে }

  writeln('After ModifyValue: ', num);  { Output: After ModifyValue: 15 }
end.

এখানে:

  • ModifyValue পদ্ধতিতে var প্যারামিটার ব্যবহার করা হয়েছে, যার মাধ্যমে প্যারামিটার x এর মান মূল ভেরিয়েবলে পরিবর্তন হয়।
  • পদ্ধতিটি কল করার পর num এর মান ১৫ হয়ে যায়।

সারাংশ

প্যাসক্যাল প্রোগ্রামিং ভাষায় procedure একটি অত্যন্ত শক্তিশালী কৌশল যা কোডের পুনরাবৃত্তি কমায় এবং কোডকে আরও সংগঠিত এবং পরিষ্কার করে তোলে। পদ্ধতিটি বিশেষভাবে বড় প্রোগ্রাম বা মডুলার প্রোগ্রামিংয়ে উপকারী, যেখানে বিভিন্ন ছোট কাজের জন্য আলাদা আলাদা পদ্ধতি ব্যবহার করা হয়।

Content added By

প্রোগ্রামিং ভাষায়, প্যারামিটার পাসিং হল প্রোগ্রামের ফাংশন বা প্রক্রিয়াতে আর্গুমেন্ট বা ইনপুট প্যারামিটারগুলি প্রেরণের প্রক্রিয়া। সাধারণত দুটি প্রধান পদ্ধতিতে প্যারামিটার পাস করা হয়: By Value এবং By Reference। এই দুই ধরনের প্যারামিটার পাসিংয়ের মধ্যে মূল পার্থক্য হল যে, ফাংশনে প্যারামিটার পাস করার সময় আসল ডাটা পরিবর্তন হবে কিনা।


১. By Value

By Value পদ্ধতিতে, ফাংশনে প্যারামিটার পাস করার সময় মূল মানের একটি কপি পাস করা হয়। এর মানে হল যে, ফাংশনটির ভিতরে প্যারামিটার পরিবর্তন হলেও মূল মানে কোন পরিবর্তন আসবে না।

উদাহরণ: By Value প্যারামিটার পাসিং

program ByValueExample;
procedure ChangeValue(num: Integer);
begin
  num := num + 10;  { ফাংশনে প্যারামিটার পরিবর্তন হবে }
  writeln('Inside procedure: ', num);
end;

var
  x: Integer;
begin
  x := 5;
  writeln('Before procedure: ', x);
  ChangeValue(x);  { x এর কপি পাস করা হচ্ছে }
  writeln('After procedure: ', x);  { মূল x এর মান অপরিবর্তিত থাকবে }
end.

আউটপুট:

Before procedure: 5
Inside procedure: 15
After procedure: 5

এখানে, ফাংশন ChangeValue-এ প্যারামিটার num পরিবর্তন করা হয়েছে, কিন্তু মূল মান x অপরিবর্তিত আছে। কারণ প্যারামিটারটি কেবলমাত্র মানের একটি কপি পেয়েছে, আসল মানটি নয়।


২. By Reference

By Reference পদ্ধতিতে, ফাংশনে প্যারামিটার পাস করার সময় আসল ডাটার রেফারেন্স পাস করা হয়, অর্থাৎ মূল মানের ঠিকানা ফাংশনে প্রেরিত হয়। এর ফলে, ফাংশনটির ভিতরে প্যারামিটার পরিবর্তন হলে মূল মানেও পরিবর্তন আসবে।

উদাহরণ: By Reference প্যারামিটার পাসিং

program ByReferenceExample;
procedure ChangeValue(var num: Integer);
begin
  num := num + 10;  { ফাংশনে প্যারামিটার পরিবর্তন হবে এবং মূল মানও পরিবর্তিত হবে }
  writeln('Inside procedure: ', num);
end;

var
  x: Integer;
begin
  x := 5;
  writeln('Before procedure: ', x);
  ChangeValue(x);  { x এর রেফারেন্স পাস করা হচ্ছে }
  writeln('After procedure: ', x);  { মূল x এর মান পরিবর্তিত হবে }
end.

আউটপুট:

Before procedure: 5
Inside procedure: 15
After procedure: 15

এখানে, ফাংশন ChangeValue-এ প্যারামিটার num পরিবর্তন করা হয়েছে, এবং যেহেতু প্যারামিটারটি মূল মানের রেফারেন্স পেয়েছে, ফলে মূল মান x-এর মানও পরিবর্তিত হয়েছে।


মূল পার্থক্য

বৈশিষ্ট্যBy ValueBy Reference
কী পাস করা হয়?প্যারামিটারটির মানের একটি কপি।প্যারামিটারটির আসল রেফারেন্স (ঠিকানা)।
ফাংশনে পরিবর্তনফাংশনের ভিতরে প্যারামিটার পরিবর্তিত হলেও মূল মান অপরিবর্তিত থাকে।ফাংশনের ভিতরে প্যারামিটার পরিবর্তন হলে মূল মানও পরিবর্তিত হয়।
উদাহরণChangeValue(x); (এখানে x-এর কপি পাস হয়)ChangeValue(x); (এখানে x-এর রেফারেন্স পাস হয়)
পারফরমেন্সসাধারণত ধীর, কারণ কপি তৈরি করতে হয়।দ্রুত, কারণ কেবল রেফারেন্স পাস হয়।

সারাংশ

  • By Value পদ্ধতিতে, ফাংশনকে একটি কপি পাস করা হয়, যার ফলে ফাংশনের ভিতরে প্যারামিটার পরিবর্তন হলেও মূল মান অপরিবর্তিত থাকে।
  • By Reference পদ্ধতিতে, ফাংশনে প্যারামিটারটির আসল রেফারেন্স পাস করা হয়, যার ফলে ফাংশনের ভিতরে প্যারামিটার পরিবর্তন হলে মূল মানও পরিবর্তিত হয়।

প্রোগ্রামিংয়ের ক্ষেত্রে, যদি আপনি চান যে ফাংশনে কোনো পরিবর্তন আসলে সেটি মূল মানে প্রভাব ফেলুক, তবে আপনি By Reference পদ্ধতি ব্যবহার করবেন। অন্যথায়, By Value পদ্ধতি ব্যবহার করা যেতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...